JAVA输入输出(.IO)
补:
输入:泛指对某设备进行数据的输入
import java.io.UnsupportedEncodingException;
import java.util.*;
import java.util.Scanner;
public class Main {
public static void main(String args[]) throws UnsupportedEncodingException {
Scanner sc = new Scanner(System.in);
String str="中华人民共和国";
byte[] bytes = str.getBytes("GBK");
//以GBK / GB2312编码转化为字节
System.out.println(bytes.length);
//输出字符长度:14
byte[] bytes = str.getBytes("UTF-8");
//以UTF-8编码转化为字节
System.out.println(bytes.length);
//输出字符长度:21
sc.close();
}
}
如果是新建.txt文件,系统自动在最前面加入几个字节
在不同编码方式下,得到的字节流不一样。
流(Stream)是从源读取并写入目标的数据序列。
输入流用于从源读取数据。
输出流用于将数据写入目标。
流的类型
根据流包含的数据,可以将其分类为:
字节流
字符流
字节流(Byte)
JAVA.IO
字节流用于读取和写入单个字节(8位)的数据。
所有字节流类都派生自称为InputStream和OutputStream的基本抽象类。
Java InputStream类
抽象类(不能直接new,创建对象)
主要的子类:
1) FileInputStream把一个文件作为InputStream,实现对文件的读取操作
2) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用
3) StringBufferInputStream:把一个String对象作为InputStream
4) PipedInputStream:实现了pipe的概念,主要在线程中使用
5) SequenceInputStream:把多个InputStream合并为一个InputStream
** FileInputStream**
常用构造方法:
常用成员方法:
int read()
输入流读取的步骤
import java.io.FileInputStream;
import java.io.IOException;
import java.util.*;
public class Main {
public static void main(String args[]) throws IOException {
FileInputStream fis=new FileInputStream("E:\\data.txt");
System.out.println(fis.available());//输出字节长度
//一次读取一个字节,获取ASCII值
//如果越界,返回-1
int len=fis.read();//读取了第1个
System.out.println(len);
len=fis.read();//读取了第2个
System.out.println(len);
len=fis.read();//读取了第3个
System.out.println(len);
len=fis.read();//读取了第4个
System.out.println(len);//如果越界,返回-1
long l1=System.currentTimeMillis();
System.out.println(fis.available());//输出字节长度
len=fis.read();
while(len!=-1) {
System.out.println(len);
len=fis.read();
}
long l2=System.currentTimeMillis();
System.out.println(l2-l1);//计算读取时间
fis.close();
}
}
read(bytes)//效率比较高
read(bytes,int begin,int end)//当有需要固定某些字符时候才使用,不常用
import java.io.FileInputStream;
import java.io.IOException;
import java.util.*;
public class Main {
public static void main(String args[]) throws IOException {
FileInputStream fis2=new FileInputStream("E:\\data.txt");
byte[] bytes=new byte[2];
int le=fis2.read(bytes);
System.out.println(le);
System.out.println(Arrays.toString(bytes));
bytes=new byte[2];
le=fis2.read(bytes);
System.out.println(le);
System.out.println(Arrays.toString(bytes));
bytes=new byte[2];
le=fis2.read(bytes);
System.out.println(le);
System.out.println(Arrays.toString(bytes));
bytes=new byte[2];
le=fis2.read(bytes);
System.out.println(le);
System.out.println(Arrays.toString(bytes));
fis2.close();
System.out.println("--------------------------");
FileInputStream fis3=new FileInputStream("E:\\data.txt");
byte[] bytes2=new byte[2];
int le2=fis3.read(bytes2);
while(le2!=-1) {
// System.out.println(le2);
//System.out.println(Arrays.toString(bytes2));
String strr=new String(bytes2,0,le2);
System.out.println(strr);
le2=fis3.read(bytes2);
}
//再简化
while((fis3.read(bytes2)!=-1) {
String strr=new String(bytes2,0,le2);
System.out.println(strr);
}
fis3.close();
}
}
Java OutputStream类
OutputStream的子类
1) FileOutputStream 文件流
2) PipedOutputStream 管道流
3) ObjectOutputStream将对象序列化后写入指定地方
4) ByteArrayOutputStream在字节数组和流之间搭建桥梁
5) SequenceOutputStream 是多种输入流的逻辑串联
6) FilterInputStream 过滤流,在读写数据的同时还可以对数据进行特殊处理
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.*;
public class Main {
public static void main(String args[]) throws IOException, InterruptedException {
FileOutputStream fos=new FileOutputStream("data1.dat");
fos.write(65);//a
fos.write(49);//1
fos.write(97);//A
fos.close();
byte[] bytes="ceshiceshiceshiceshiceshi123456".getBytes();
FileOutputStream fos2=new FileOutputStream("data2.dat");
fos2.write(bytes);
fos2.write("测试".getBytes());
fos2.close();
FileOutputStream fos3=new FileOutputStream("data3.dat");
byte[] bytes2="测试ceshiceshiceshiceshiceshi123456".getBytes();
// fos3.write(bytes,2,10);//从2开始写10个字符
fos3.write(bytes2,0,3);//从2开始写100个字符
fos3.close();
}
}
Data Output/Input Stream
注意:按什么格式输入,就按什么格式输出。
按某格式输出,只会输出某格式的字符。
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Datatext {
public static void main(String[] args) throws IOException {
DataOutputStream dos1=
new DataOutputStream(new FileOutputStream("data2.dat"));
dos1.writeInt(100);
dos1.writeLong(2121212121212l);
dos1.writeUTF("你好sfsafsfsafsf");
DataInputStream dis1=
new DataInputStream(new FileInputStream("data2.dat"));
int data1=dis1.readInt();
System.out.println(data1);
long l=dis1.readLong();
System.out.println(l);
String str1=dis1.readUTF();
System.out.println(str1);
dos1.close();
dis1.close();
}
}
BufferedInputStream
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class BufferedStreamTest {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedInputStream bis1=
new BufferedInputStream(new FileInputStream("data2.dat"));
long l2=System.currentTimeMillis();
byte[] a=new byte[10000];
int len= bis1.read(a);
//读一个字节,放在缓冲区(默认为8k/8192字节),还继续在访问,不返回,故效率高
System.out.println(len);
long l1=System.currentTimeMillis();
System.out.println(l1-l2);
}
}
RandomAccessFileTest
import java.awt.RadialGradientPaint;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import org.omg.Messaging.SYNC_WITH_TRANSPORT;
public class RandomAccessFileTest {
public static void main(String[] args) throws IOException {
//文件指针
RandomAccessFile raf1=
new RandomAccessFile("data1.dat", "rw");
raf1.writeInt(1000);
raf1.writeDouble(1.1231);
raf1.writeUTF("13213");
//指针回位
raf1.seek(0);
int i=raf1.readInt();
double d=raf1.readDouble();
String str1=raf1.readUTF();
System.out.println(i);
System.out.println(d);
System.out.println(str1);
raf1.close();
}
}
字符流(Character )
字符流用于读取和写入单个数据字符。
所有字符流类都派生自基本抽象类Reader和Writer。
Java Reader类
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileReadWriterTest {
public static void main(String[] args) throws IOException {
// 写
FileWriter writer = // 以字符为单位写数据:“中” 以GBK输入需要2个字节,1个字符
new FileWriter("data1.txt", false);
// 默认为覆盖false ,true代表追加。
writer.write(65);
writer.write("\n中国\n".toCharArray());
writer.write("中华人民共和国\n".toCharArray(), 2, 4);
writer.write("中国人民解放军\n");
writer.write("中华人民共和国\n", 2, 6);
writer.close();
// 读
FileReader reader = new FileReader("data1.txt");
char[] chars = new char[5];
int len = 0;
while ((len = reader.read(chars)) != -1) {
System.out.println(chars);
String str = new String(chars, 0, len);
System.out.println(str);
}
}
}
Java Writer类
输入输出重定向
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.util.*;
public class Main {
public static void main(String args[]) throws IOException, InterruptedException {
//输出重定向
System.setOut(new PrintStream("data7.txt"));
System.out.println("sifjisfjdifjdsfidjfifjdsif");
//输入重定向
System.setIn(new FileInputStream("data7.txt"));
Scanner sc=new Scanner(System.in);
String str=sc.next();
System.out.println(str);
}
}
File类
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream.GetField;
import java.io.PrintStream;
import java.util.*;
public class Main {
public static void main(String args[]) throws IOException, InterruptedException {
File file=new File("E:\\eclipse-workspace\\my\\data1");//绝对路径“/”=="\\"
System.out.println(file.exists());//文件是否存在
if(file.exists()) {
file.delete();//只能删除空文件夹/文件。
}
else {
file.mkdir();//创建
}
file =new File("src/Main.java");//相对路径 “/”=="\\"
System.out.println(file.exists());
System.out.println(file.getAbsolutePath());//从相对路径找到绝对路径(不需要文件存在)
System.out.println(file.getTotalSpace());//如果是真的,则输出文件所在磁盘的容量大小
System.out.println(file.getFreeSpace());//如果是真的,则输出文件所在磁盘的可用容量的大小
System.out.println(file.getParent());//返回文件的上一级文件名
System.out.println(file.getName());//返回文件名
System.out.println(file.getPath());//返回相对路径
System.out.println(file.lastModified());//返回此抽象路径名表示的文件最后一次被修改的时间。
System.out.println(file.length());//返回文件大小(字节数)
file=new File("abc.txt");
System.out.println(file.exists());
file.createNewFile();//创建新文件.txt
System.out.println(file.exists());
// file.deleteOnExit();//虚拟机执行结束/程序结束时候再删除文件;
}
}
List系列方法
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream.GetField;
import java.io.PrintStream;
import java.nio.file.DirectoryStream.Filter;
import java.util.*;
import org.omg.CosNaming.NamingContextExtPackage.StringNameHelper;
public class Main {
public static void main(String args[]) throws IOException, InterruptedException {
File file=new File("E:\\eclipse-workspace");
//list
String[] files=file.list();//返回目录中的文件和目录。
for(String filename:files) {
System.out.println(filename);
}
String[] files1= file.list(new FilenameFilter() {//匿名内部类
public boolean accept(File dir, String name) {
// System.out.println(dir);//父路径
// System.out.println(name);//文件名称
if(name.endsWith(".txt")) return true;
else
return false;//返回false的不能被输出
}
});
for(String afile:files1) {
System.out.println(afile);
}
}
}