//字节流
package midProject;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class MidByteIoTest {
public static void main(String[] args) throws Exception {
//拆分文件
MidByteIoTest.byteChaiFenTest();
//合并文件
MidByteIoTest.heBingTest();
}
//文本内容:一二三。拆分文件。
public static void byteChaiFenTest() throws Exception{
//创建文件对象流 inputStreamReader才有编码的效果
File file =new File("e:/Java练习文件夹/字节流拆分.txt");
FileInputStream fis=new FileInputStream(file);
FileOutputStream fos = null;
//创建容器
byte[] c =new byte[2];
//读取数据
int in =(int) (file.length()/2);
int i = 0,len=0;
while((len=fis.read(c))!=-1) {
fos=new FileOutputStream("e:/Java练习文件夹/字节流拆分-" + i+".txt");
System.out.println(len);
fos.write(c,0,len);//此处应该理解为,每次从下标0的位置开始取值,每次取len个值
i++;
}
fis.close();
fos.close();
for (int j=0; j<=in; j++) {
File f = new File("e:/Java练习文件夹/字节流拆分-" + j+".txt");
if (f.length()!=0) {
System.out.printf("输出子文件%s,其大小是%,d字节%n", f.getName(), f.length());
}
}
}
//合并方法
public static void heBingTest() throws Exception {
FileInputStream fis=null;
FileOutputStream fos=new FileOutputStream(new File("e:/Java练习文件夹/字节流拆分3.txt"));;
byte[] by= new byte[10];
for (int i = 0; i <3; i++) {
fis=new FileInputStream(new File("e:/Java练习文件夹/字节流拆分-" + i+".txt"));
int len;
if ((len=fis.read(by))!=-1) {
fos.write(by,0,len);
}
}
fis.close();
fos.close();
}
}
//字符流
package midProject;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.Writer;
import java.util.Arrays;
public class MidCharIoTest {
//测试
public static void main(String[] args) throws Exception {
//拆分测试
MidCharIoTest.charChaiFenTest();
//合并测试
MidCharIoTest.charHebingTest();
//设置编码字符
MidCharIoTest.charSetTest();
//去除标识符测试
MidCharIoTest.deleteRom();
//readline测试
MidCharIoTest.readLineTest();
}
public MidCharIoTest() {
System.out.println("new 对象时就会调用类本身的无参构造,当然,如果有有参构造,那就调用有参的");
}
public MidCharIoTest(int m) {
m=2;
System.out.println(m);
}
/*找到一个大于10k的文件,按照10k为单位,拆分成多个子文件,并且以编号作为文件名结束。*/
public static void charChaiFenTest() throws Exception {
//创建流、容器
Reader re=new FileReader(new File("e:/Java练习文件夹/字符流拆分.txt"));
//InputStreamReader re = new InputStreamReader(new FileInputStream("e:/Java练习文件夹/字符流拆分.txt"));
char[] c =new char[2];
Writer wr=null;
int len=0;
int i=0;
//拆分
while ((len=re.read(c))!=-1) { //while的用法此处类似于for无限循环,当满足条件时就跳出循环。
System.out.print(len+"\t");
System.out.println(c);
wr =new FileWriter(new File("e:/Java练习文件夹/字符流拆分-"+i+".txt"));
wr.write(c, 0, len);
i++;
wr.flush(); //字符流方式读取的缓存区,因此得用flush方法写一串读出一串。
}
wr.close();
re.close();//记得关闭流。
File file=new File("e:/Java练习文件夹/字符流拆分.txt");
for (int j=0; j<=(int)(file.length())/2 ; j++) {
File f = new File("e:/Java练习文件夹/字符流拆分-" + j+".txt");
if (file.length()!=0) {
System.out.printf("输出子文件%s,其大小是%,d字节%n", f.getName(), f.length());
}
}
}
//合并
public static void charHebingTest() throws Exception {
//容器
char[] c=new char[2];
int len;
//创建流对象
for (int i = 0; i < 2; i++) {
Reader re = new FileReader(new File("e:/Java练习文件夹/字符流拆分-" + i+".txt"));
Writer wr = new FileWriter(new File("e:/Java练习文件夹/字符流拆分3.txt"),true);
while ((len=re.read(c))!=-1) {
wr.write(c, 0, len);
}
re.close();
wr.close();
}
}
//字符流中文问题
//16进制E5 B1 8C 用UTF-8编码对应的的汉字是:
public static void charSetTest() throws Exception {
File file =new File("e:/Java练习文件夹/java中文问题.txt");
//Reader re= new FileReader(file);
InputStreamReader re=new InputStreamReader(new FileInputStream(file),"utf-8");//java偷懒,reader没有此方法,只有上级InputStreamReader才有此方法
char[] by=new char[(int)(file.length())];
while (re.read(by)!=-1) {
System.out.println(by);
}
re.close();
//进制转换
byte[] bs = {(byte) 0xE5,(byte) 0xB1,(byte) 0x8C};
String str = new String(bs,"UTF-8");
System.out.println("E5 B1 8C 用UTF-8编码对应的的汉字是:"+str);
}
//如果用记事本根据UTF-8编码保存汉字就会在最前面生成一段标示符,这个标示符用于表示该文件是使用UTF-8编码的。
//找出这段标示符对应的十六进制,并且开发一个方法,自动去除这段标示符
public static void deleteRom() throws Exception, FileNotFoundException {
File file =new File("e:/Java练习文件夹/java中文问题.txt");
InputStreamReader re=new InputStreamReader(new FileInputStream(file),"utf-8");
char[] by = new char[(int) file.length()];
re.read(by);
for (byte b:Arrays.toString(by).getBytes()) {
int i=b&0xff; //补码-数据类型由大到小,需要补码。
System.out.print(Integer.toHexString(i)+"\t");//十六进制跟int整数型互转,前人已经写好了方法
}
re.close();
}
//readLine方法读一行就输出,然后换行继续读一行输出。
public static void readLineTest() throws Exception {
File file=new File("e:/Java练习文件夹/javaReadLineTest.txt");
if (!file.exists()) {
file.createNewFile();
}
String line=null;
BufferedWriter bw=new BufferedWriter(new FileWriter(file));
bw.write(" 你说神马,没说神马");
bw.flush();
BufferedReader br=new BufferedReader(new FileReader(file));
while((line=br.readLine())!=null) {
System.out.println(new String(line).trim());
}
br.close();
bw.close();
}
}