Java读取文本文件中文乱码问题
2017-08-14 00:00
465 查看
Java中有几种类型的流?
Java的I/O类处理
Reader 类是 Java 的 I/O 中读字符的父类,而 InputStream 类是读字节的父类,InputStreamReader 类就是关联字节到字符的桥梁,它负责在 I/O 过程中处理读取字节到字符的转换,而具体字节到字符的解码实现它由 StreamDecoder 去实现,在 StreamDecoder 解码过程中必须由用户指定 Charset 编码格式。值得注意的是如果你没有指定 Charset,将使用本地环境中的默认字符集,例如在中文环境中将使用 GBK 编码。
Java的I/O类处理图
总结:Java读取数据流的时候,一定要指定数据流的编码方式,否则将使用本地环境中的默认字符集。
经过上述分析,修改之后的代码如下:
[java]
view plain
copy
print
?
List<String> lines=new ArrayList<String>();
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(fileName),"UTF-8"));
String line = null;
while ((line = br.readLine()) != null) {
lines.add(line);
}
br.close();
参考资料:
http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/
http://hi.baidu.com/annleecn/blog/item/154770ed900738db2e2e2151.html
http://sd8089730.iteye.com/blog/1290895
http://www.360doc.com/content/07/0403/09/16749_427888.shtml
from:http://blog.csdn.net/greenqingqingws/article/details/7395213
FileInputSream类 FileInputStream(String name) FileInputStream(File file) 第一个构造方法是用给定的文件名name创建一个FileInputStream对象 第二个方法使用File对象创建FileInputStream对象 使用文件输入流读取文件 例如 FileInputStream istream=new FileInputStream(“myfile.dat”); 或 File f=new File(“myfile.dat”); FileInputStream istream =new FileInputStream(f); 处理IO异常 Try{ FileInputStream istream=new FileInputStream(“myfile.dat”); } Catch(IOException e){} 从输入流中读取字节 Int read();从输入流中顺序读取源中的单个字节数据,返回字节值(0~255之间的一个整数),如果到达源的末尾,则返回-1 Read方法还可以吧多个字节读入到字节数组中: Int read(byte b[]); Int read(byte b[],int off,int len); 关闭流 使用close(); FileOutputStream类 该类提供了基本的文件写入能力,除了从OutputStream类继承来的方法外,FileOutputStream类还提供了两个构造方法: FileOutputStream(String name) FileOutputStream(File file) 第一个构造方法,给指定的文件名name创建一个FileOutputStreak对象 第二个构造方法,使用File对象创建FileOutputStream对象 可以使用write()方法把字节写入到输出流到达目的地 Write的格式: Public void write(byte b[]) 其功能就是把b.length个字节到输出流 Public void write(byte b[],int off,int len)给定字节数组中,偏移off处写入len个字节到输出流 FileOutputStream流顺序的写文件,只要不关闭流,每次调用write方法就顺序地向输出流写入内容,直到流被关闭。 以上代码见hyh.io--File/Fileinputstream/Fileoutputsream 以上输入输出流容易出现的问题就是:汉字乱码 FileReader类和FileWriter类 与FileInputStream和FileOutputStream字节流相对应的是FileReader和FileWriter字符流,其分别是Reader和Writer的子类,构造方法如下: FileReader(String filename) FileWriter(String filename) 使用字节读取文件时,字节流不能直接操作Unicode字符,所以Java提供字符流。由于汉字在文件中占用了两个字节,如果使用字节流,读取不当会出现乱码现象,采用字符流就可以避免这个现象,因为在Unicode字符中,一个汉字被看做一个字符。 如果需要每次读取一行数据,FileReader类没有提供这样的方法,所以必须把这个流再接到另外一个流伤,从后面的流中读取一行数据。Java为其命名为BufferedReader类,构造方法: BufferedReader(Reader in) BufferedReader流能够读取文本行,方法是readLine() 通过向BufferedReader传递一个Reader对象,来创建一个BufferedReader对象, FileReader inone=new FileReader(“Student.txt”); BufferedReader intwo=BufferedReader(inone); 类似的可以将BufferedWriter流和FileWriter流连接在一起,然后使用BufferedWriter流将数据写到目的地, FileWriter tofile=new FileWriter(”hello.txt”); BufferedWriter out=BufferedWriter(tofile) 然后out使用BufferedReader类的方法: Write(String s,int off,int len)把字符串s写入到文件中,off是s开始处的偏移量,len是写入的字符数量 代码详情见hyh.javaio.FileReaderandWriter 代码总结:FileReader和FileWriter可以进行汉字的读取和写入 BufferedReader有读取行的功能,readLine() RandomAccessFile类 RandomAccessFile类创建的流指向既可以作为源也可以作为目的地。换句话说,当想对一个文件进行读写操作时,可以创建一个指向该文件的RandomAccessFile流 构造方法: RandomAccessFile(String name,String mode)参数name用来确定一个文件名,给出流的源。参数mode取r或者rw(只读或者读写),决定对文件的访问权限。 RandomAccessFile(File file,String mode)参数file是一个File对象,给出源,同时也是目的地。参数mode决定访问权限。 该类中有一个seek(long a)方法,用来定位RandomAccessFile流的读写位置。参数a确定读写位置距离文件开头的字节个数。 还可以调用getFilePointer()方法或者流当前的读写位置 类方法P280: 关闭文件 获取读写位置等。。。。。。。。 使用RandomAccessFile流实现一个通讯录的录入与显示系统 见RandomAccessFile 数据流P284 数组流P286 对象流P288 序列化与对象克隆P290 文件锁FileLockP293 Process类中的流P295 带进度条的输入流P298(学习笔记:教材为Java2实用教程第三版(耿祥义编著),因为使用了word进行整理,首字母大写忘记取消和一些代码在myeclipse上,但是不妨碍你查看)from:http://zhidao.baidu.com/question/367239248129398724.html
Java的I/O类处理
Reader 类是 Java 的 I/O 中读字符的父类,而 InputStream 类是读字节的父类,InputStreamReader 类就是关联字节到字符的桥梁,它负责在 I/O 过程中处理读取字节到字符的转换,而具体字节到字符的解码实现它由 StreamDecoder 去实现,在 StreamDecoder 解码过程中必须由用户指定 Charset 编码格式。值得注意的是如果你没有指定 Charset,将使用本地环境中的默认字符集,例如在中文环境中将使用 GBK 编码。
Java的I/O类处理图
总结:Java读取数据流的时候,一定要指定数据流的编码方式,否则将使用本地环境中的默认字符集。
经过上述分析,修改之后的代码如下:
[java]
view plain
copy
?
List<String> lines=new ArrayList<String>();
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(fileName),"UTF-8"));
String line = null;
while ((line = br.readLine()) != null) {
lines.add(line);
}
br.close();
参考资料:
http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/
http://hi.baidu.com/annleecn/blog/item/154770ed900738db2e2e2151.html
http://sd8089730.iteye.com/blog/1290895
http://www.360doc.com/content/07/0403/09/16749_427888.shtml
from:http://blog.csdn.net/greenqingqingws/article/details/7395213
相关文章推荐
- Java读取文本文件中文乱码问题
- Java读取文本文件中文乱码问题(转)
- Java读取文本文件中文乱码问题
- Java读取文本文件中文乱码问题
- Java读取文本文件中文乱码问题
- Python java解决中文乱码问题,读取文本文件为乱码,编辑器打开正常
- Java读取文本文件中文乱码问题
- Java读取文本文件中文乱码问题
- java读取默认编码是ansi的文本文件时,解决中文乱码问题
- (转) Java读取文本文件中文乱码问题
- Java读取文本文件中文乱码问题
- Java读取文本文件中文乱码问题
- Java读取文本文件中文乱码问题 .转载
- java读取文件中文乱码问题
- Java读取中文的乱码问题
- Java IO读取文件中文乱码问题 (读写文件不错的通用写法)
- Java底层代码实现单文件读取和写入(解决中文乱码问题)
- java 记事本读取文本文件的乱码问题,终于解决了 O(∩_∩)O~ 多谢 uu老师帮助
- 【Java IO知识】读取中文乱码问题解决
- java读取access中文乱码问题