`
TrueBrian
  • 浏览: 8936 次
社区版块
存档分类
最新评论

Java 流与文件笔记

 
阅读更多

1.嵌套的输入流

DataInputStream din = new DataInputStream(new BufferedInputStream(new FileInputStream("1.dat")));

这里 需要从一个文件中读入数据,数据是数字类型,FileInputStream 没有读入数字类型的方法,也没有缓存机制,DataInputStream没有从文件中读数据的方法,

因此可以用重重嵌套构造一个新的构造器。


2.文本操作

PrintWriter 和BufferedReader(new FileReader("2.txt"))

一个典型的输入系统是:

String line;
while(line = in.readLine() != null){
  do sth;
}

然而BufferedReader没有任何读入数字的处理方法,建议使用Scanner来输入文本。

3.read()方法读文件

                File f = new File(path);
		InputStream fis = new FileInputStream(f);
		int l = 0;
		byte[] buf = new byte[2];   //只有两个字节的缓冲区
		while((l=fis.read(buf)) != -1){
			System.out.println(new String(buf,0,l));
		}
		System.out.println("length:" + l);

读到文件末尾时会返回-1,作为判断条件,缓冲区只有两个字节,即一个中文,这样出来的结果 一个字一行,且 l永远为0。


四.使用nio来读取和写入文件。

在nio中,读取和写入文件都是对缓冲区进行的。读是从缓冲区中读数据,写是向缓冲区中写数据。因此,在读和写之前,总是先要创建一个缓冲区Buffer,

有不同类型的缓冲区,主要的,使用最多的是ByteBuffer,即字节缓冲区。

1.创建缓冲区方法:

ByteBuffer buf = ByteBuffer.allocate(1024);
2.nio中使用通道来执行读或取得操作。通道是双向的,能读能写,以块为数据单位。通道都是通过输入输出流来获取的,所以输入输出流还是要的,只不过

这里只是为了从它们中获取通道。

从输入输出流中获取channel

    FileInputStream fin = new FileInputStream( infile );
    FileOutputStream fout = new FileOutputStream( outfile );

    FileChannel fcin = fin.getChannel();
    FileChannel fcout = fout.getChannel();
3.得到了通道和缓冲区,则可以进行文件的读写了。读是使用channe从缓冲区中读,写是使用channel向缓冲区中写。我们使用上面的缓冲区和通道:

fcin.read(buf);
fcout.write(buf);

这里还要介绍缓冲区的两个方法;

每个缓冲区都有一个容量,一个当前位置。

clear() 清空缓冲区,让缓冲区可以重新使用,位置回0;

flip() 位置回0,这样使用get方法可以对缓冲区进行遍历。

4.一个例子 copyFile 复制文件

package com.wlc.nio;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import static java.io.File.separator;

public class CopyFile {

	public static void main(String[] args) throws IOException {
		String path = "C:" + separator + "Users" + separator + "wlc"
				+ separator + "Desktop" + separator + "项目修改点.txt";
		String to = "C:" + separator + "Users" + separator + "wlc"
				+ separator + "Desktop" + separator + "项目修改点2.txt";
		copyFiles(path, to);
	}

	public static void copyFiles(String from, String to) throws IOException {
		FileInputStream in = new FileInputStream(from);
		FileOutputStream out = new FileOutputStream(to);

		FileChannel fcin = in.getChannel();
		FileChannel fout = out.getChannel();

		ByteBuffer buf = ByteBuffer.allocate(1024);

		while (true) {
			buf.clear();
			int r = fcin.read(buf);  //从通道中读数据到缓冲区,读一个buf,下面就写入一个buf
			if (r == -1) {          //如果r = -1,则说明读完数据了,就跳出了
				break;
			}
			buf.flip();        //这里在写之前千万要记住先flip一下,不然指针指到了buf的最后,写出来的为空了
			fout.write(buf);   //将缓冲区中数据写入通道
		}
	}

}

5.缓冲区分片

我们可以对一个缓冲区进行分片,所谓分片,即从一个已有的缓冲区中分出一个片段来,实际还是原来那个缓冲区,相当于一部分,或叫子缓冲区。这个

子缓冲区可以用来执行一些特定的操作。

一个缓冲区分片的例子:

package com.wlc.nio;

import java.nio.ByteBuffer;

public class T3 {
	public static void main(String[] args) {
		ByteBuffer buf = ByteBuffer.allocate(10);
		for(int i = 0;i < 10;i ++){
			buf.put((byte) i);
		}
		
		buf.position(3);   //分片起始位置
		buf.limit(6);     //分片区的终点位置
		ByteBuffer slice = buf.slice();
		
		for(int i = 0;i < 3;i ++){              //创建的分片位置从0开始算
			int temp = slice.get(i) * 10;   //给每个值乘以10
			slice.put(i, (byte)temp);
		}
		buf.flip();
		buf.limit(buf.capacity());
		while(buf.hasRemaining()){
			System.out.println((int)buf.get());
		}
	}
}
运行结果:

0
1
2
30
40
50
6
7
8
9

6.nio scatter/gather 分散和聚合

参考:点击打开链接



参考:http://www.cnblogs.com/rollenholt/archive/2011/09/11/2173787.html点击打开链接


分享到:
评论

相关推荐

    Java 的 IO流笔记.md

    ### Java IO流学习笔记 #### 一、IO流的四大抽象类 - **InputStream/OutputStream**:字节的输入输出流的抽象类。 - 数据单位:字节(8比特,范围0-255) - **Reader/Writer**:字符的输入输出流的抽象类。 - ...

    Java基础 学习笔记 Markdownr版

    本学习笔记主要涵盖了Java的基础知识,包括面向对象、集合、IO流、多线程、反射与动态代理以及Java 8的新特性等方面,旨在帮助初学者或有经验的开发者巩固和提升Java编程技能。 1. 面向对象(OOP):Java的核心是...

    java io流学习笔记1

    Java IO流是Java编程语言中处理输入输出操作的重要部分,尤其在数据传输、文件读写等方面发挥着核心作用。本文将深入探讨Java IO流的基本概念、类型以及它们在实际开发中的应用。 首先,理解IO流的基本概念至关重要...

    java超强笔记

    笔记会讲解如何在Java中读写文件,理解流的概念,以及文件的复制、追加等操作。 在面向对象高级特性的部分,笔记可能包含抽象类、接口、内部类、匿名类、枚举,以及泛型和注解的使用。这些特性使得Java代码更加灵活...

    javaIO流笔记

    在Java中,输入/输出(Input/Output,简称IO)操作是程序与外部设备进行数据交换的重要方式。Java提供了强大的IO流处理类库,主要位于`java.io`包中。这些类库支持多种数据类型的操作,包括文本文件、二进制文件等。...

    java IO流学习笔记

    ### Java IO流学习笔记 #### 异常处理与IO流操作 在进行Java IO流的学习过程中,异常处理是非常重要的一个方面。本节将详细介绍如何在Java中处理异常,并结合具体的IO流操作进行说明。 #### 一、异常处理 在Java...

    黑马java教程知识点笔记整理

    【Java编程基础】 ...以上是黑马Java教程知识点笔记的主要内容,涵盖了Java编程的基础到进阶知识,是学习和巩固Java技能的重要参考资料。通过深入理解和实践这些知识点,开发者可以逐步提升Java编程能力。

    java学习笔记markdown

    4. **IO流**:介绍输入/输出流的概念,包括文件操作、字节流、字符流、对象序列化等。这部分内容涉及数据的读写和传输。 5. **网络编程**:讲解Socket编程,如何创建客户端和服务器进行网络通信,以及HTTP、HTTPS...

    Java JDK 7学习笔记 PDF

    4. **try-with-resources语句**:这个新特性允许自动关闭实现了`AutoCloseable`接口的资源,如文件流,提高了代码的健壮性和可读性。 5. **NIO.2文件系统API**:引入了`java.nio.file`包,提供了一套新的文件系统...

    Java 学习笔记Java学习笔记

    5. IO流:Java的IO流系统支持对文件、网络、内存等进行输入输出操作。流分为字节流和字符流,又分为输入流和输出流。还有缓冲流、对象流、转换流等高级流概念。 6. 网络编程:Java提供Socket和ServerSocket类进行...

    java笔记 java笔记

    标准I/O流与文件 Java提供了强大的I/O处理能力。 - **文件操作**:读取、写入、删除等操作。 - **跨平台性**:Java的文件操作不受操作系统限制。 - **序列化接口**:用于将对象转换为字节流以便持久化。 - **I/O...

    李兴华java笔记

    4. **IO流**:Java的输入/输出流系统提供了丰富的功能,用于读写文件、网络通信等。笔记会讲解流的分类、缓冲流、字符流与字节流的区别,以及NIO(非阻塞I/O)的相关知识。 5. **多线程**:Java支持多线程编程,...

    java全套笔记 来自狂神说java笔录.zip

    5. **输入/输出流**:学习如何使用FileInputStream、FileOutputStream、BufferedReader、BufferedWriter等进行文件操作。 6. **多线程**:掌握Thread类和Runnable接口,线程同步机制,如synchronized关键字、wait()...

    尚硅谷JAVA基础笔记吐血整理

    “尚硅谷JAVA基础笔记”涵盖了Java语言的基础知识,包括语言概述、基本语法、面向对象概念、封装、继承和多态,以及一些关键概念如形参与实参、属性与局部变量、构造器、this关键字、包和MVC设计模式的使用。...

    狂神说Java系列笔记.rar

    IO流是Java中处理数据传输的核心概念,包括字节流和字符流,以及如何进行文件读写、网络通信等操作。 2. **25、SpringBoot入门及原理.pdf**:SpringBoot是Java企业级应用开发的热门框架,简化了Spring的配置和启动...

    java学习好用的笔记

    Java的IO库支持字符流和字节流,它们可以读取或写入文件、网络、内存等不同来源的数据。此外,还有缓冲区流、转换流和对象流等高级流,以满足不同场景的需求。 最后,"多线程"在现代编程中不可或缺。Java内置了对多...

    Java 学成在线笔记

    5. **IO流**:输入/输出流的概念,文件操作,以及字节流和字符流的区别。 6. **多线程**:线程的基本概念,线程同步与互斥,以及线程池的使用。 7. **网络编程**:Socket编程,TCP与UDP的区别,以及如何建立客户端...

    java基础的详细案例笔记

    7. **输入/输出流**:Java的I/O流用于读写文件和网络数据,笔记可能涵盖了FileInputStream、FileOutputStream、BufferedReader、BufferedWriter等基本流的使用。 8. **集合框架**:如ArrayList、LinkedList、...

    韩顺平编写的java学习笔记(全)

    4. **文件I/O流编程**:读写文件、数据序列化等。 5. **网络编程**:TCP/IP协议的应用,如客户端/服务器模型。 6. **多线程编程**:利用多线程提高程序性能。 #### Java EE基础知识 1. **Java面向对象编程**:与...

    宋红康java笔记.rar

    这份压缩包文件包含了大量的Java编程知识点,旨在帮助初学者和有经验的开发者深入理解和掌握Java语言的核心概念与高级特性。以下是根据这份笔记整理的一些关键知识点: 1. **Java基础**:Java的基础语法是学习的...

Global site tag (gtag.js) - Google Analytics