字符流和字节流:
字节流有两个基类:
InputStream
OutputStream
字符流两个基类:
Reader
Writer
先学习一下字符流的特点。
既然Io流是用于操作数据的,那么数据的最常见体现形式是文件。那么先以操作文件为主来演示。
这是IO异常处理的方式:
public class Main {
public static void main(String[] args) throws IOException
{
// write your code here
//一个FileWriter对象。该对象一被初始化就必须要明确被才做的文件。
//而且该文件会被创建到指定目录下。如果该目录下已有同名文件,则会被覆盖。
FileWriter fw=null;
try {
fw=new FileWriter("d:\\out.txt");//在try初始化
//调用write方法,将字符写入到流中,需要抛IO异常
fw.write("abcde");
}catch (IOException e)
{
System.out.println(e.toString());
}
finally
{
try {
if (fw!=null)
fw.close();
}catch (IOException e)
{
System.out.println(e.toString());
}
}
}
}
自定义一个类中包含一个功能和readLine一致的方法。来模拟一下BufferedReader
class MyBufferedReader
{
private FileReader r;
MyBufferedReader(FileReader r)
{
this.r=r;
}
//可以一次读一行的方法
public String myreadline()throws IOException
{
StringBuilder sb=new StringBuilder();
int ch=0;
while ((ch=r.read())!=-1)
{
if (ch=='\r')
continue;
if (ch=='\n')
return sb.toString();
sb.append((char)ch);
}
if (sb.length()!=0)
return sb.toString();
return null;
}
public void myclose()throws IOException
{
r.close();
}
}
JAVA编程思想上的几个小练习:
练习8.打开一个文本文件,每次读取一行内容。将每行作为一个String读入,并将那个String对象置入一个LinkedList中。按相反的顺序打印出LinkedList中的所有行
public static void bufferinput()throws IOException
{
/*
为了提高效率,加入缓冲技术,将字符读取流对象作为参数传递给缓冲对象
的构造函数。
*/
FileReader fr=new FileReader("C:\\Users\\Wave\\Desktop\\新建文件夹\\kaguya.txt");
//fr最后不需要关闭
BufferedReader in=new BufferedReader(fr);
String s;
LinkedList lk=new LinkedList();
StringBuilder sb=new StringBuilder();
while ((s=in.readLine())!=null)
//readLine方法返回的时候只返回回车符之前的数据内容,并不返回回车符
{
sb.append(s+"\n");
lk.add(s+"\n");
}
in.close();
formattedinput(lk);
System.out.print(sb.toString());
Iterator it=lk.iterator();
while (it.hasNext())
{
s=it.next().toString();
reverseout(s);
}
}
public static void formattedinput(LinkedList lk)throws IOException
{
BufferedWriter out=new BufferedWriter(new FileWriter(filename));
String s;
Iterator it=lk.iterator();
while (it.hasNext())
{
out.write(it.next().toString());
}
out.close();
}
public static void reverseout(String s)
{
char[] s1=s.toCharArray();
int len=s.length();
for (int i=len-1;i>0;i--)
{
System.out.print(s1[i]);
}
}
练习17.用TextFile和Map<Character,Integer>创建一个程序,它可以对一个文件中所有不同字符出现的次数进行计数。
public static void TextFile(FileReader fr)throws IOException
{
Map<Character,Integer> m=new HashMap<Character, Integer>();
BufferedReader br=null;
int s;
int count=0;
char c;
char[] chs;
try {
br=new BufferedReader(fr);
while ((s=br.read())!=-1)
{
c=(char)s;
if (!(c>='a'&&c<='z'||c>='A'&&c<='Z'))
{
continue;
}
Integer value=m.get(c);//获取值
if (value!=null)
{
count=value;
}
count++;
m.put(c,count);
count=0;
}
System.out.print(m);
}catch (IOException e)
{
System.out.print(e.toString());
}finally {
try{
if (br!=null)
br.close();
}catch (IOException e)
{
System.out.print(e.toString());
}
}
}
练习21.接受标准输入并将所有字符转换成大写,
再将结果写入到标准输出流中。将文件的内容重定向到该程序中
public static void changeupper() throws IOException
{
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter out=new BufferedWriter(new FileWriter(filename));
String s,str;
//标准输入
while ((s=stdin.readLine())!=null&&s.length()!=0)
{
str=s.toUpperCase();
out.write(str+"\n");
}
out.close();
}