题目:将奇数位的小写字母传化为大写字母
实验代码:
package Bian; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.Scanner; public class A { public static void main(String[] args) throws Exception { File f = new File("f:" + File.separator + "test.txt");//定位文件位置 OutputStream out = null; out = new FileOutputStream(f); Scanner in = new Scanner(System.in);//输入 System.out.println("请输入:"); String str = in.nextLine(); byte b[] = str.getBytes();//转为数组 for (int i = 0; i < b.length; i++) { if (i % 2 == 0 && b[i] >= 'a' && b[i] <= 'z') {//判定条件 b[i] = (byte) (b[i] - 32); } out.write(b[i]);//写入 } out.close();//关闭 } }
实验结果截图:
实验所遇问题:
总的来说问题不大,但实现数据的重复输入没有解决,虽然有for循环但却没有停止输出的条件,加了刷新还是不对,然后用字符流又做了一遍使用里面的FileWriter中的文件追加功能还是不对。等会再用System中的输出重新定向看看。
学习总结:
这周主要学习了java的io类并主要学习的是对其文件的主要操作。
同时java.io中的方法太多了就不一一列举了,
其中学习了字节流与字符流的基本操作:
1.使用File类打开一个文件。
2.通过字节流或者字符流的子类指出输出的位置。
3.进行读/写操作。
4.关闭输入/输出。
字节流:
InputStream 类的常用子类如下。
ByteArrayInputStream 类:将字节数组转换为字节输入流,从中读取字节。
FileInputStream 类:从文件中读取数据。
PipedInputStream 类:连接到一个 PipedOutputStream(管道输出流)。
SequenceInputStream 类:将多个字节输入流串联成一个字节输入流。
ObjectInputStream 类:将对象反序列化。
使用 InputStream 类的方法可以从流中读取一个或一批字节。表 1 列出了 InputStream 类的常用方法。
表1 InputStream类的常用方法
方法名及返回值类型 说明
int read() 从输入流中读取一个 8 位的字节,并把它转换为 0~255 的整数,最后返 回整数。
如果返回 -1,则表示已经到了输入流的末尾。为了提高 I/O 操作的效率,建议尽量
使用 read() 方法的另外两种形式
int read(byte[] b) 从输入流中读取若干字节,并把它们保存到参数 b 指定的字节数组中。 该方法返回
读取的字节数。如果返回 -1,则表示已经到了输入流的末尾
int read(byte[] b, int off, int len) 从输入流中读取若干字节,并把它们保存到参数b指定的字节数组中。其中,off 指
定在字节数组中开始保存数据的起始下标;len 指定读取的字节数。该方法返回实际
读取的字节数。如果返回 -1,则表示已经到了输入流的末尾
void close() 关闭输入流。在读操作完成后,应该关闭输入流,系统将会释放与这个输入流相关
的资源。注意,InputStream 类本身的 close() 方法不执行任何 操作,但是它的许多
子类重写了 close() 方法
int available() 返回可以从输入流中读取的字节数
long skip(long n) 从输入流中跳过参数n指定数目的字节。该方法返回跳过的字节数
void mark(int readLimit) 在输入流的当前位置开始设置标记,参数 readLimit 则指定了最多被设置 标记的字
节数
boolean markSupported() 判断当前输入流是否允许设置标记,是则返回 true,否则返回 false
void reset() 将输入流的指针返回到设置标记的起始处
注意:在使用 mark() 方法和 reset() 方法之前,需要判断该文件系统是否支持这两个方法,以避免对程序造成影响。
字节输出流
OutputStream 类及其子类的对象表示一个字节输出流。OutputStream 类的常用子类如下。
1.ByteArrayOutputStream 类:向内存缓冲区的字节数组中写数据。
2.FileOutputStream 类:向文件中写数据。
3.PipedOutputStream 类:连接到一个 PipedlntputStream(管道输入流)。
4.ObjectOutputStream 类:将对象序列化。
利用 OutputStream 类的方法可以从流中写入一个或一批字节。表 2 列出了 OutputStream 类的常用方法。
表2 OutputStream类的常用方法
方法名及返回值类型 说明
void write(int b) 向输出流写入一个字节。这里的参数是 int 类型,但是它允许使用表达式,
而不用强制转换成 byte 类型。为了提高 I/O 操作的效率,建议尽量使用
write() 方法的另外两种形式
1.void write(byte[] b) 把参数 b 指定的字节数组中的所有字节写到输出流中
2.void write(byte[] b,int off,int len) 把参数 b 指定的字节数组中的若干字节写到输出流中。其中,off 指定字节
数组中的起始下标,len 表示元素个数
void close() 关闭输出流。写操作完成后,应该关闭输出流。系统将会释放与这个输出
流相关的资源。注意,OutputStream 类本身的 close() 方法不执行任何操
作,但是它的许多子类重写了 close() 方法
void flush() 为了提高效率,在向输出流中写入数据时,数据一般会先保存到内存缓冲
区中,只有当缓冲区中的数据达到一定程度时,缓冲区中的数据才会被写
入输出流中。使用 flush() 方法则可以强制将缓冲区中的数据写入输 出流,
并清空缓冲区
字节数组输入流
1.ByteArrayInputStream 类可以从内存的字节数组中读取数据,该类有如下两种构造方法重载形式。
2.ByteArrayInputStream(byte[] buf):创建一个字节数组输入流,字节数组类型的数据源由参数 buf 指定。
3.ByteArrayInputStream(byte[] buf,int offse,int length):创建一个字节数组输入流,其中,参数 buf 指定字节数组类型的数据源,offset 指定在数组中开始读取数据的起始下标位置,length 指定读取的元素个数。
字符流:
Reader 类是所有字符流输入类的父类,该类定义了许多方法,这些方法对所有子类都是有效的。
Reader 类的常用子类如下。
1.CharArrayReader 类:将字符数组转换为字符输入流,从中读取字符。
2.StringReader 类:将字符串转换为字符输入流,从中读取字符。
3.BufferedReader 类:为其他字符输入流提供读缓冲区。
4.PipedReader 类:连接到一个 PipedWriter。
5.InputStreamReader 类:将字节输入流转换为字符输入流,可以指定字符编码。
与 InputStream 类相同,在 Reader 类中也包含 close()、mark()、skip() 和 reset() 等方法,这些方法可以参考 InputStream 类的方法。下面主要介绍 Reader 类中的 read() 方法,如表 1 所示。
表1 Reader类中的read()方法
方法名及返回值类型 说明
int read() 从输入流中读取一个字符,并把它转换为 0~65535 的整数。如果返回 -1, 则表示
已经到了输入流的末尾。为了提高 I/O 操作的效率,建议尽量使 用下面两种 read()
方法
int read(char[] cbuf) 从输入流中读取若干个字符,并把它们保存到参数 cbuf 指定的字符数组中。 该方
法返回读取的字符数,如果返回 -1,则表示已经到了输入流的末尾
int read(char[] cbuf,int off,int len) 从输入流中读取若干个字符,并把它们保存到参数 cbuf 指定的字符数组中。其中,
off 指定在字符数组中开始保存数据的起始下标,len 指定读 取的字符数。该方法返
回实际读取的字符数,如果返回 -1,则表示已经 到了输入流的末尾
字符输出流
与 Reader类相反,Writer 类是所有字符输出流的父类,该类中有许多方法,这些方法对继承该类的所有子类都是有效的。
Writer 类的常用子类如下。
1.CharArrayWriter 类:向内存缓冲区的字符数组写数据。
2.StringWriter 类:向内存缓冲区的字符串(StringBuffer)写数据。
3.BufferedWriter 类:为其他字符输出流提供写缓冲区。
PipedWriter 类:连接到一个 PipedReader。
OutputStreamReader 类:将字节输出流转换为字符输出流,可以指定字符编码。
与 OutputStream 类相同,Writer 类也包含 close()、flush() 等方法,这些方法可以参考 OutputStream 类的方法。下面主要介绍 Writer 类中的 write() 方法和 append() 方法,如表 2 所示。
表2 Writer类中的write()方法和append()方法
方法名及返回值类型 说明
1.void write(int c) 向输出流中写入一个字符
2.void write(char[] cbuf) 把参数 cbuf 指定的字符数组中的所有字符写到输出流中
3.void write(char[] cbuf,int off,int len) 把参数 cbuf 指定的字符数组中的若干字符写到输出流中。其中,off 指定
字符数组中的起始下标,len 表示元素个数
1.void write(String str) 向输出流中写入一个字符串
2.void write(String str, int off,int len) 向输出流中写入一个字符串中的部分字符。其中,off 指定字符串中的起
始偏移量,len 表示字符个数
1.append(char c) 将参数 c 指定的字符添加到输出流中
2.append(charSequence esq) 将参数 esq 指定的字符序列添加到输出流中
3.append(charSequence esq,int start,int end) 将参数 esq 指定的字符序列的子序列添加到输出流中。其中,start 指定
子序列的第一个字符的索引,end 指定子序列中最后一个字符后面的字符
的索引,也就是说子序列的内容包含 start 索引处的字符,但不包括 end
索引处的字符
注意:Writer 类所有的方法在出错的情况下都会引发 IOException 异常。关闭一个流后,再对其进行任何操作都会产生错误。
字符文件输入流
为了读取方便,Java 提供了用来读取字符文件的便捷类——FileReader。该类的构造方法有如下两种重载形式。
1.FileReader(File file):在给定要读取数据的文件的情况下创建一个新的 FileReader 对象。其中,file 表示要从中读取数据的文件。
2.FileReader(String fileName):在给定从中读取数据的文件名的情况下创建一个新 FileReader 对象。其中,fileName 表示要从中读取数据的文件的名称,表示的是一个文件的完整路径。
在用该类的构造方法创建 FileReader 读取对象时,默认的字符编码及字节缓冲区大小都是由系统设定的。要自己指定这些值,可以在 FilelnputStream 上构造一个 InputStreamReader。
注意:在创建 FileReader 对象时可能会引发一个 FileNotFoundException 异常,因此需要使用 try catch 语句捕获该异常。
字符流和字节流的操作步骤相同,都是首先创建输入流或输出流对象,即建立连接管道,建立完成后进行读或写操作,最后关闭输入/输出流通道。