a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 162|回复: 3

[基础知识] JAVA基础知识指导:TXT文件详解

[复制链接]
发表于 2012-8-4 12:37:27 | 显示全部楼层 |阅读模式
单单读取TXT文件的话,用BufferedReader效率比较高,也方便一些。需要注意的是,TXT文件在不同版本的操作系统中编码格式会有所不同,笔者曾经试过在两台同样的WIN7系统下,一个格式为"UTF-8",一个格式为"GB2312".所以在操作TXT文件之前,最好先确认一下该TXT文件的编码格式。
- S4 k5 C+ C; p' ^9 y5 N4 p  u$ b   
6 L; H! u  }/ `: q    [java] view plaincopyprint?
+ r; }7 Y9 S# K+ l: [    / V# w4 l9 L9 O9 o  w
    01.????private String GetTxtCode(String path) // 获取text文件编码+ Q  s4 v# t# s! y3 \
    ! f4 }' F  K3 o  E" h. P/ V2 E
    02.    {
4 g! T2 o- u/ I% y# Y% P    % r' ~# Z3 r- s+ F  s
    03.        String code = "";
3 e0 I* u3 c% i, I% ~   
/ S5 B! W$ u6 l! D    04.        code = "gb2312";
: L0 v3 f5 S% T4 I* D+ t    9 k' t5 C9 u, c0 @6 W+ o
    05.        try {+ _, V; K# i- N
      W, f! m  ?6 x2 K( `% o4 t
    06.            InputStream is = new FileInputStream(path);$ e9 ]- \# c2 d) [/ G- L
   
2 @3 ]5 u, b  i% l    07.            byte[] head = new byte[3];' Y9 X3 K9 V2 W# |. Y% J6 o
    2 ?1 }* ~2 E6 t" ?: F
    08.            try {0 K7 W2 \& ^0 L0 p" Z* e2 f
    " ~5 V. t/ {! p5 s3 U5 N
    09.                is.read(head);
& ]) z9 D' {8 R1 @' a% V' K   
0 r$ h4 S: I# j. |! g. H    10.2 s6 S! G* T4 K; l+ y6 r/ d
   
$ m0 f- P2 ~6 r7 c9 d    11.                if (head[0] == -1 && head[1] == -2), l* \' F4 h- z' l
    , \; v2 o! e/ N7 T" E$ C! U. ~
    12.                    code = "UTF-16";
0 Z' r9 A5 C% \0 e7 R: Y! [4 x    " a  r: C+ ~4 F& d8 ^% n; k
    13.                if (head[0] == -2 && head[1] == -1)
7 }+ L. t5 y0 a, l   
  R' v' g% {, i. s: F# u: p) x    14.                    code = "Unicode";
- u  }" |. B6 P( g- k    * ]" \: m9 ]' \5 C
    15.                if (head[0] == -17 && head[1] == -69 && head[2] == -65)9 b7 f% z& e# j
    5 Z: U6 U9 O1 i
    16.                    code = "UTF-8";
: i0 X7 q& P% e' `: O5 z3 {# Z    ; l+ z- C) W% [6 e' R
    17.            } catch (IOException e) {, l# i5 J/ ~9 d1 x, m
   
9 z& h1 T' [$ V+ W6 E    18.( ^; M4 x. I, U" K
    3 Q9 e1 p4 q9 k1 v' X" L1 W
    19.                e.printStackTrace();
$ P0 I% _/ [$ d) g7 C) V    2 W4 p  T$ \- j
    20.            }0 A6 e$ l  r- x8 L
    2 J1 t/ \- |* ^1 [4 R
    21.        } catch (FileNotFoundException e) {
) Y! e* N8 }' y" b5 j" i   
" A& @5 _% o6 s    22.
3 u8 k3 W& j) j0 f7 ?    3 G9 O) _+ Z  N7 ~( q9 N
    23.            e.printStackTrace();# B* g( `0 E7 d, v+ @7 P
    + }' @3 w7 A" d# p% t
    24.        }
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:37:28 | 显示全部楼层

JAVA基础知识指导:TXT文件详解

25.$ S; D) R! t% U9 F. y
   
* S; }' o( F. Q4 T9 w; x    26.        return code;- O1 z4 @, n- ~$ u
    - f6 d3 G* C  t, ~8 ~2 F2 ?
    27.    }
. U' l6 H# v+ G1 n! e4 J5 Q    & w" d9 h" k& f, X
    ????private String GetTxtCode(String path) // 获取text文件编码
- Z' `1 U$ ^+ Y' Y) D2 \- \    & T+ {8 j- p  _4 z+ G7 I6 B3 u
    {' H& C4 Z- P. O. N
   
# E6 v) v' W5 ~+ s: u1 Y    String code = "";
6 S# n* n0 K. L5 B& t1 ?    " f& w. Q3 @/ o
    code = "gb2312";
) m1 M. N; J7 x3 Q4 V: _, D. q   
& O1 i1 k/ z# o6 @' y6 K0 I    try {
" ^7 ?& ^$ e& e  {    * N# N; N- o4 a! }
    InputStream is = new FileInputStream(path);
& N8 L1 B5 i8 S; U   
* n$ s3 x! }# p/ u  s: s    byte[] head = new byte[3];" ^- T+ }! |+ F8 J+ h
    # {. f! c; a8 N8 o* k9 |
    try {
! O( r: }8 Q- Q8 V7 V( y8 k    8 r( R3 Y( z( o* p. `" d: z$ B
    is.read(head);
8 x! _: d. ]: E& ~( p7 E+ w    % S" n$ ~7 f5 A. v' Z. D
    if (head[0] == -1 && head[1] == -2)+ K2 s7 y/ k6 ?* ?* o1 f% o
   
, S+ ]2 c. l3 B+ B" ~    code = "UTF-16";2 B$ K+ j0 X" ~& B
   
3 J( S8 X  Y0 j3 Y8 `/ s$ V0 y    if (head[0] == -2 && head[1] == -1)
& F! o! Q' F- @! Q2 h   
& |; ~, y' u/ N4 W) l) N! U    code = "Unicode";/ y( D5 `- Q$ Y! p3 F
    " F  i4 |/ G  ~2 C
    if (head[0] == -17 && head[1] == -69 && head[2] == -65)
7 {% q1 r3 c! p# J9 Q: N   
/ Y5 P# ~6 d' n' H; k    code = "UTF-8";2 b+ E! Q1 `  S  u0 `6 ~0 d
    3 p; {' s2 c3 W5 p. M' e, x
    } catch (IOException e) {/ g% B2 u- V1 Q0 V7 C
   
7 t  a& E7 g0 e/ u9 K    e.printStackTrace();
/ ^( j/ h2 O/ [: ~* c  d   
, H5 z2 W& ^- F    }' j$ l  G& b/ f: ?5 {( Y3 G: V
    1 C. T5 }) F$ W: ]
    } catch (FileNotFoundException e) {6 l0 L3 |2 ]9 \8 \+ N% J$ Y1 r
   
; W1 @; G2 S, R/ c    e.printStackTrace();
$ a2 h* w9 l4 |, g4 _    + v) F; w- d. u, E* l; V& r
    }
" U' v, c0 X) Q2 S- b9 u   
1 D# t$ {' k9 P& X9 G    return code;; y" R+ I( I* E8 G! h7 r
    ' y1 q2 X' A; P
    }7 u- |, s& b! n- [& L" ]* i0 B3 ^
   
, g( H% O  x6 B! e" u" P: U9 j    此时我们就可以将FileCode传入FileInputStream安全打开TXT文件。如果使用二维数组作为返回值读取文件的话,我们最好先读取文件行数以定义数组维度,方法示例如下:
( @) A* f2 w- X7 o2 f3 u' ~6 {, R    / x' d4 P( I4 ?. w
    [java] view plaincopyprint?/ q8 t2 _" w* g8 A
   
6 \1 O1 G4 Z8 ^6 e  c" m    01.public int GetLines(String fileName) throws IOException //获取文件行数以便建立数组维度
# B1 P* W! h9 @: T8 U   
9 _0 ]6 n( C2 s7 ?& o1 T    02.    {' e; x& J$ m1 b
   
+ C# J2 l( ?1 D3 o# x5 _  a    03.        FileReader in = new FileReader(fileName);. [' a0 g8 T* g' U- k7 A# J
    * p  J- S) b! x( k
    04.        LineNumberReader reader = new LineNumberReader(in);" _" |. L3 j- ?4 g$ L$ B
   
1 D, _: g7 U! U$ C+ J8 O* P    05.        String strLine = reader.readLine();0 D9 V: Q% S/ _% \. Q& {! P" b
    . X9 P. F, N, L# k
    06.        int totalLines = 0;
7 G9 A/ q7 Q* E: d    / E( T, ]0 n7 _
    07.        while (strLine != null) {8 s/ A2 b2 Y( Y% G
   
; O& k8 L- d/ P$ E9 N, V! r    08.            totalLines++;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:37:29 | 显示全部楼层

JAVA基础知识指导:TXT文件详解

09.            strLine = reader.readLine();
9 o) R! l& Q( L3 U6 V' H7 G; ^   
0 M. \2 v+ r- @7 V    10.        }
2 @$ \: _7 X, i    # ?1 b  R: ^7 J' U
    11.        reader.close();( H+ q$ x4 Z( A' T) @
    / f  u. u  S/ ?( M
    12.        in.close();6 D$ _' I& G4 a6 T3 B+ e
    7 J5 L. }. m& j% \# b- m8 M4 g
    13.        return totalLines;
" H3 N1 u' X* z4 I% U   
, s& C7 ~3 q* E0 Q# ]5 [    14.; j0 u3 e  m/ M( k' L( j
    6 K# p5 V! n* R2 _+ e4 j
    15.    }5 {* {$ ]" }+ I: n
    [nextpage]6 [6 \9 i/ B' c. G& |
    public int GetLines(String fileName) throws IOException //获取文件行数以便建立数组维度
+ y) {9 y! s# {   
* e4 D' l& q( v) {    {1 Q1 y9 J$ T+ }6 [% o
    ( B9 @" h) O; Q  F0 a
    FileReader in = new FileReader(fileName);+ Z6 P. U% Q/ Z* W) z' N
   
, ^+ `  ~+ v9 q    LineNumberReader reader = new LineNumberReader(in);
/ u, n; M1 x$ i   
+ M$ \& g, ?) u6 z1 O- R& U    String strLine = reader.readLine();5 o: \. x! j5 v) K  `
    0 y5 m# c0 k( I4 P9 B
    int totalLines = 0;
/ e8 }# J8 e9 c, F5 J   
- z5 H4 q6 R; e8 c3 f) Y    while (strLine != null) {
" x0 j" o1 ^$ D' G    % u" w0 W; l$ T6 {  O" A3 Z
    totalLines++;
1 }9 H$ P6 g0 l* F    7 S; c; {8 f6 x! D6 n( ?4 V# a: B
    strLine = reader.readLine();5 @. {% t3 R3 h, _3 g
   
- i* ~$ x+ y- x1 R/ L: H# s    }5 ]  V+ Z9 N9 R! p' \; ~, s8 Z5 z
   
1 p" h* O8 p* M2 P$ y    reader.close();
6 T% I6 o5 k+ D* h3 ?, T6 p- k   
9 j3 E! `$ j! J5 L' ]$ ^( a    in.close();; K& A; C- I/ Y4 e+ ~8 P" Y2 K
    3 e5 I* Z* l. v  T
    return totalLines;
1 Q: w. S. v- x8 ?7 v   
5 u& w! b8 @0 v5 N  _2 i    }
( |# H+ c8 t% J+ ]4 t    " e$ M( Z# B- V0 D  L! C
    然后读取文件信息,这里读取的文件每行四个信息块,以制表符为分隔符:
- o! C6 j2 u$ I* y   
# o) e( f# G+ l, A, G) i    [java] view plaincopyprint?
. Q2 v2 N7 \2 b  o  U7 w- M) @- H    6 S: X. `/ R: H5 E" \: i
    01.public String [][] GetInfo(String path) throws IOException, FileNotFoundException{
% Q+ @# [7 ^4 B    5 F: }) J. J! W0 l
    02./ o( S. O6 ]0 h( O# ?$ B; x
   
8 c9 w0 ?( u3 t% D6 u    03.        int Lines=this.GetLines(path);
7 G2 F: T( Q, ]. L  t( ^% V6 r8 d    ( i! o2 C9 z' y9 }4 E4 O
    04.        String [][] s = new String[Lines][4];6 m$ T+ C1 m  D: j' ?
    * m3 j. |) @& O  q
    05.            File f = new File(path);& f7 {1 V  y8 K& ]1 b4 p1 O
    - h: B# u1 h  s# a1 M
    06.
7 w! y% Y  G5 v4 |/ G   
! {5 N8 J& G7 W" S: m2 p  ?    07.        String code = GetTxtCode(path);6 M1 ~" H2 J; L" V6 G! C
    8 A% _" y2 J6 Z8 m2 v( _1 `' i
    08.//      System.out.println("Txt File Code:" + code);1 |. g7 P+ ?, G
   
2 \2 u- Y" o/ m1 K- g0 i, L    09.        if (f.isFile() && f.exists()) {
; P  l; ]; J* Z2 x' r8 y) x    ! z3 o4 ~8 P0 P5 ~
    10.            InputStreamReader sr = new InputStreamReader(
4 o- o4 u: ^, S- \    # T$ h/ O/ O/ n5 ]
    11.                    new FileInputStream(f), code);  s3 k6 o- T$ k6 @6 {. i+ p
   
4 f8 z- O% T9 S, j5 [    12.            BufferedReader bf = new BufferedReader(sr);2 [/ F; j; C% p6 y' B
   
7 q( O$ ]5 m/ q5 y" b  _$ H0 ]    13.//          bf.skip(1);
1 V( D  g9 l# X   
0 i, u4 p# o$ \5 q7 o+ z0 `6 a    14.            String line;! M3 p2 a8 n; e! ~" E
   
8 n7 B% o% d) L    15.            String[] lin=new String[4];/ F! C$ C: A3 n" E- O
      g2 ^# J6 E5 T8 X# N* k
    16.            int i=0;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:37:30 | 显示全部楼层

JAVA基础知识指导:TXT文件详解

17.            while ((line = bf.readLine()) != null) {) S0 ~' ~: H# U9 S) s5 B
   
8 p) L9 O/ W. |" i4 ?7 O    18.                lin = line.split("  ");6 Z5 C# N4 x3 O7 M$ f3 K
   
: k& y0 i1 g* Z/ h2 d    19.
, ~5 q$ a' x$ N# U& t- i5 j   
, D: ?( a9 \; }    20.                s[0]=lin[0];
' u9 Q% f/ _! {. D1 T# d9 b   
" G5 [, l5 J" K( Q# P2 L' Q. }    21.                s[1]=lin[1];
) E2 ^) E* d+ l6 n) y. q+ T   
7 H3 Q7 m% S1 T% s    22.                s[2]=lin[2];
* D# K' b0 R% Z: g      `- u9 J6 @5 y3 O/ x# U2 O
    23.                s[3]=lin[3];
. t/ K* C$ K7 y& b2 ?9 P% y   
+ P3 d# F& ~  u9 }. R    24.                i++;
  b$ G2 B; F% y% Q* J, h   
( W7 d9 w- a7 h  O    25.3 ?+ a3 f# E2 J1 i$ H
   
, e7 C! u: a: e: i- C1 b7 t5 K: h    26.            }
( [3 u/ X. }  t  R    ! c, p9 J0 E" l2 N  @) j
    27.
$ {7 w7 c- k2 l* s1 ]4 ?   
8 h9 i/ m7 t0 ]/ c$ Z2 B1 l    28.3 Y+ q+ w. ^/ A% q% x+ V
   
- T1 D7 v$ P' G( r0 i0 h3 f6 P    29.        }1 D8 }  |" G, ~! w& Y
    ; m5 x1 `* {* b: [* w" i: q8 Z
    30.        return s;% _* t$ S6 u% {; L3 s3 x  K
    0 t# ^) c2 E4 ^/ f9 X
    31.    }
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-16 13:25 , Processed in 0.176739 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表