/**
* 创建一个与hello.txt在相同文件目录下的另一个名为abc.txt的文件
*/
public class Exer1 {
public static void main(String[] args) {
File file1 = new File("hello.txt");
System.out.println(file1.getAbsolutePath());
File file2 = new File(file1.getAbsoluteFile().getParent(), "abc.txt");
System.out.println(file2.getAbsolutePath());
}
}
I/O 流中的 I/O 是 Input/Output 的缩写, I/O 技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。
java.io 包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。
Java 的 IO 流共涉及 40 多个类,实际上非常规则,都是从如下 4 个抽象基类派生的。
@Test
public void test2() {
FileReader reader = null;
try {
//1.创建File对象,对应hello.txt文件
File file = new File("C:\\Users\\22923\\Desktop\\Java\\Java SE\\src\\p177\\hello.txt");
//2.创建输入的字符流,用于读取数据
reader = new FileReader(file);
//3.读取数据并显示到控制台上
char[] cbuffer = new char[5];
int len;
while ((len = reader.read(cbuffer)) != -1) {
for (int i = 0; i < len; i++) {
System.out.print(cbuffer[i]);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.关闭流资源
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Test
public void test3(){
FileWriter fileWriter = null;
try {
//1.创建File对象,指明要写出的文件名称
File file = new File("C:\\Users\\22923\\Desktop\\Java\\Java SE\\src\\p177\\info.txt");
//2.创建输出流
//覆盖文件使用的构造器
fileWriter = new FileWriter(file);
//在现有的文件基础上追加内容使用的构造器
fileWriter = new FileWriter(file, false);
//3.写出的具体过程
fileWriter.write("hellowoeld123");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fileWriter != null)
//4.流的关闭
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 需求:复制图片
*/
@Test
public void test1() {
FileInputStream inputStream = null;
FileOutputStream outputStream = null;
try {
//1.创建相关的File类的对象
File srcFile = new File("C:\\Users\\22923\\Desktop\\Java\\Java SE\\src\\p178\\2391e3248003e6ec91f355117ac020c.jpg");
File destFile = new File("C:\\Users\\22923\\Desktop\\Java\\Java SE\\src\\p178\\1.jpg");
//2.创建相关的字节流
inputStream = new FileInputStream(srcFile);
outputStream = new FileOutputStream(destFile);
//3.数据的读入和写出
byte[] buffer = new byte[1024];
int len; //记录每次读入到buffer中字节的个数
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//4.关闭流资源
if (outputStream != null)
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
//4.关闭流资源
if (inputStream != null)
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
提升文件读写的效率。
/**
* 使用BufferedInputStream\BufferedOutputStream复制文件
*/
@Test
public void test1() {
BufferedInputStream bufferedInputStream = null;
BufferedOutputStream bufferedOutputStream = null;
try {
//1.创建相关的File类的对象
File srcFile = new File("C:\\Users\\22923\\Desktop\\Java\\Java SE\\src\\p178\\2391e3248003e6ec91f355117ac020c.jpg");
File destFile = new File("C:\\Users\\22923\\Desktop\\Java\\Java SE\\src\\p178\\1.jpg");
//2.创建相关的字节流、缓冲流
FileInputStream inputStream = new FileInputStream(srcFile);
FileOutputStream outputStream = new FileOutputStream(destFile);
bufferedInputStream = new BufferedInputStream(inputStream);
bufferedOutputStream = new BufferedOutputStream(outputStream);
//3.数据的读入和写出
byte[] buffer = new byte[1024];
int len; //记录每次读入到buffer中字节的个数
while ((len = bufferedInputStream.read(buffer)) != -1) {
bufferedOutputStream.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//4.关闭外层缓冲流资源。
//由于关闭外层流时会自动对内层流执行关闭操作,所以可以省略关闭内层流的操作
try {
if (bufferedOutputStream != null)
bufferedOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (bufferedInputStream != null)
bufferedInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 使用BufferedReader和BufferedWriter完成文本文件的复制
*/
@Test
public void test2() {
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
try {
File file1 = new File("hello.txt");
File file2 = new File("hello——copy.txt");
bufferedReader = new BufferedReader(new FileReader(file1));
bufferedWriter = new BufferedWriter(new FileWriter(file2));
String data;
while ((data = bufferedReader.readLine()) != null){
bufferedWriter.write(data);
bufferedWriter.newLine(); //换行操作
bufferedWriter.flush(); //刷新方法,每当调用此方法时,会主动将内存中数据写出到磁盘文件中
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufferedReader != null)
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}try {
if (bufferedWriter != null)
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Test
public void test2() {
FileOutputStream fos = null;
OutputStreamWriter oos = null;
try {
File file1 = new File("hello.txt");
File file2 = new File("hello_utf8.txt");
FileInputStream fis = new FileInputStream(file1);
InputStreamReader isr = new InputStreamReader(fis, "GBK");
fos = new FileOutputStream(file2);
oos = new OutputStreamWriter(fos, "utf8");
char[] cBuffer = new char[1024];
int len;
while ((len = isr.read()) != -1) {
oos.write(cBuffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (oos != null) {
oos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (fos != null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
一个字符(char)占用2个字节。在内存中使用的字符集称为Unicode字符集。
可以读写基本数据类型的变量和引用数据类型的变量。
对象序列化机制允许把内存中的 Java 对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。
使用ObjectOutputStream实现,将内存中的Java对象保存在文件中或通过网络传输出去。
/**
* 序列化过程
*
* @throws IOException
*/
@Test
public void test1() throws IOException {
File file = new File("hello.txt");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
oos.writeUTF("hello");
oos.close();
}
使用ObjectInputStream实现,将文件中的数据或网络传输过来的数据还原为内存的Java对象。
/**
* 反序列化过程
*
* @throws IOException
*/
@Test
public void test2() throws IOException {
File file = new File("hello.txt");
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
String str1 = ois.readUTF();
System.out.println(str1);
ois.close();
}
IO 技术开发中,代码量很大,而且代码的重复率较高,为此 Apache 软件基金会,开发了 IO 技术的工具类 commonsIO,大大简化了 IO 开发。