1 字节流读取字符的问题
上述读取文件中有中文,导致乱码了。
2 字符输入流【Reader】
java.io.Reader
字符流的抽象基类,用实现类FileReader类操作。
public void close() :关闭此流并释放与此流相关联的任何系统资源。
public int read(): 从输入流读取一个字符。
public int read(char[] buf): 从输入流中读取一些字符,并将它们存储到字符数组 buf中 。如果读取完成返回-1
默认字符编码:默认UTF-8,底层实际还是字节流。
FileReader(File file): 创建一个新的 FileReader ,给定要读取的File对象。
FileReader(String fileName): 创建一个新的 FileReader ,给定要读取的文件的路径。
package FileRead;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Demo02 {
public static void main(String[] args) throws IOException {
FileReader reader = new FileReader("day07/file.txt");
int read1 = reader.read();
int read2 = reader.read();
int read3 = reader.read();
int read4 = reader.read();
int read5 = reader.read();
int read6 = reader.read();
System.out.println("read1 = " + (char)read1);//a
System.out.println("read2 = " + (char)read2);//b
System.out.println("read3 = " + (char)read3);//c
System.out.println("read4 = " + (char)read4);//狗
System.out.println("read5 = " + (char)read5);//子
System.out.println("read6 = " + (char)read6);//
reader.close();
}
}
解决上述问题。
public int read(): 从输入流读取一个字符
package FileRead;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Demo02 {
public static void main(String[] args) throws IOException {
FileReader reader = new FileReader("day07/file.txt");
// int read1 = reader.read();
// int read2 = reader.read();
// int read3 = reader.read();
// int read4 = reader.read();
// int read5 = reader.read();
// int read6 = reader.read();
//
// System.out.println("read1 = " + (char)read1);//a
// System.out.println("read2 = " + (char)read2);//b
// System.out.println("read3 = " + (char)read3);//c
// System.out.println("read4 = " + (char)read4);//狗
// System.out.println("read5 = " + (char)read5);//子
// System.out.println("read6 = " + (char)read6);//
int len;
while ((len=reader.read())!=-1){
System.out.println(len+"=" + (char)len);
}
reader.close();
}
}
public int read(char[] buf): 从输入流中读取一些字符,并将它们存储到字符数组 buf中 。
如果读取完成返回-1
package FileRead;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Demo02 {
public static void main(String[] args) throws IOException {
FileReader reader = new FileReader("day07/file.txt");
// int read1 = reader.read();
// int read2 = reader.read();
// int read3 = reader.read();
// int read4 = reader.read();
// int read5 = reader.read();
// int read6 = reader.read();
//
// System.out.println("read1 = " + (char)read1);//a
// System.out.println("read2 = " + (char)read2);//b
// System.out.println("read3 = " + (char)read3);//c
// System.out.println("read4 = " + (char)read4);//狗
// System.out.println("read5 = " + (char)read5);//子
// System.out.println("read6 = " + (char)read6);//
int len;
//增加char数组
char[] buf = new char[1];
while ((len=reader.read(buf))!=-1){
//String(char[] value, int offset, int count) 将字符数组value中,从offset位置开始的count个字符变成字符串
String s = new String(buf, 0, len);
System.out.print(s);
}
reader.close();
}
}
3 字符输出流【Writer】
java.io.Writer
是一个字符输出的抽象类,是所有字符输出流的基类。
FileWriter类来操作
构造方法:
FileWriter(File file): 创建一个新的 FileWriter,给定要读取的File对象。
FileWriter(String fileName): 创建一个新的 FileWriter,给定要读取的文件的名称。
注:当你创建一个流对象时,必须传入一个文件路径,类似于FileOutputStream,如果关联的文件不存在,就会自动创建。如果存在这个文件中的数据就会被清空。
package FileWriter;
import java.io.FileWriter;
import java.io.IOException;
public class Demo01 {
public static void main(String[] args) throws IOException {
FileWriter fileWriter = new FileWriter("day07/fileOut.txt");
fileWriter.write("狗子你好!");
fileWriter.close();
}
}
public void write(int c) :写出一个字符。
public void write(char[] cbuf):将 b.length字符从指定的字符数组写出此输出流。
public abstract void write(char[] b, int off, int len) :从指定的字符数组写出 len字符,从偏移量 off开始输出到此输出流。
public void write(String str) :写出一个字符串。
public void write(String str,int off, int len) :写出一个字符串中指定位置off开始的len个字符
package FileWriter;
import java.io.FileWriter;
import java.io.IOException;
public class Demo02 {
public static void main(String[] args) throws IOException {
FileWriter fileWriter = new FileWriter("day07/fileOut.txt");
String s = System.lineSeparator();//换行
//写出单个字符
//public void write(int c):写一个字符
fileWriter.write(97);
fileWriter.write(s);
char[] chars ={'a','狗','子','你','h'};
//写出字符数组
//public void write(char[] chars):写出字符数组中所有内容
fileWriter.write(chars);
//public void write(char[] chars,int off,int len):写出字符数组中从off位置开始的len个字符
fileWriter.write(s);
fileWriter.write(chars,1,2);
fileWriter.write(s);
//字符串
//public void write(String str):写出字符串
fileWriter.write("哈喽");
fileWriter.write(s);
//public void write(String str,int off,int len):写出字符串中从off位置开始的len个字符
String str="狗子粉丝破万!";
fileWriter.write(str, 2,4);
// fileWriter.write("狗子你好!");
fileWriter.close();
}
}
续写换行
public FileWriter(String path,booean append)
public FileWriter(File file,booean append)
package FileWriter;
import java.io.FileWriter;
import java.io.IOException;
public class Demo03 {
public static void main(String[] args) throws IOException {
FileWriter fileWriter = new FileWriter("day07/fileOut.txt",true);
String s = System.lineSeparator();//换行
fileWriter.write(s);
fileWriter.write("换行成功");
fileWriter.write("续写...");
fileWriter.close();
}
}
public abstract void close() :关闭此输出流并释放与此流相关联的任何系统资源。
public abstract void flush() :刷新此输出流并强制任何缓冲的输出字符被写出。
这个两个函数,一个是关流,一个是再不关流的时候刷缓冲(char数组)释放数组中的资源写入指定文件中。
通过下述代码可以测试出缓冲的数组的最大值为8k
package FileWriter;
import java.io.FileWriter;
import java.io.IOException;
public class Demo04 {
public static void main(String[] args) throws IOException {
FileWriter fileWriter = new FileWriter("day07/fileOutMax.txt");
for (int i = 0; i < 1024 * 9; i++) {
fileWriter.write("a");
}
}
}
从测试中得知char的缓冲区间为8192即为8k,大于这个区间后会自动写出。
上述两个类和之前文章字节输入输出流用法类似,不再做过多分析,如对你有帮助请您点赞收藏,谢谢!!!!