Fork me on GitHub

IO

注意:所有文章除特别说明外,转载请注明出处.

字符串和文本I/O

1.字符串的比较
    警告:如果使用像> >= < <=这样的比较运算符比较两个字符串,就会发生语法错误。替代的方法是:s1.compareTo(s2)来进行比较。

    注意:如果两个字符串相等,equals方法返回true;如果它们不等,方法返回false。compareTo()方法会根据一个字符串是否等于、大于或小于另一个字符串而返回0、正整数或负整数。

    警告:length()方法是String的一个方法,但它是数组对象的一个属性,所以要获取字符串s中的字符个数,必须使用 s.length() 而要获取数组a中的元素个数,必须使用s.length。

提示:数组提供length属性来获取数组的长度,String提供了length()方法来计算字符串的长度。此外,Java中还有一个计算对象大小的方法size()方法,该方法是针对泛型集合而言,用于查看泛型中有多少个元素。

2.文件类File
    File类特意提供了一种抽象,这种抽象表示以不依赖机器的方式处理很多文件和路径名依赖机器的复杂问题。

    注意:在windows中目录的分隔符是(\),但是在Java中,反斜杠是一个特殊的字符,需要转义写成(\\)。

    注意:构建一个File实例并不会在机器上创建一个文件。不管文件是否存在,都可以创建任意文件名的File实例。我们可以调用File实例上的exists()方法判断文件是否存在。

3.文件的输入输出

    File对象封装了文件或路径的属性,但是这一File对象不包括创建文件以及向/从文件读/写数据的方法。为了完成I/O操作,我们需要使用恰当的Java I/O类创建对象。

        1.PrintWriter 写数据
            该类可以用来创建一个文件,并向文本文件中写入数据。
            注意:如果文件不存在,那么会调用PrintWriter的构造方法创建一个新的文件。如果文件已经存在,那么文件当前内容会被抛弃。

        2.使用Scanner读取数据
            java.util.Scanner类用来从控制台读取字符串和基本类型数值。为了能够从键盘读取,需要为System.in创建一个Scanner。
            注意:new Scanner(String) 为给定的字符串创建一个Scanner。为创建Scanner从文件中读取数据,需要使用构造方法 new File(filename) 利用 java.io.File 类创建File类的一个实例。

总结:

1.字符串是封装在String类中的对象,要创建一个字符串,可以使用11种构造方法之一,也可以使用字符串直接量进行简洁初始化。
2.String 对象是不可变的,它的内容不能改变。
3.可以调用字符串的length()方法获取它的长度,使用charAt(index)方法从字符串中提取特定下标位置的字符,使用indexOf()方法和lastIndexOf()方法找出一个字符串中的某个字符或者某个子串。
4.substring()方法从字符串中提取子串
5.

1.序列流SequenceInputStream

序列流表示对多个流进行合并,表示其它输入流的逻辑串联。

案例1:合并两个流

private static void testSequenceInputStream() throws IOException {
    FileInputStream fis1 = new FileInputStream("c:\\a.txt");
    FileInputStream fis2 = new FileInputStream("c:\\b.txt");

    SequenceInputStream s1 = new SequenceInputStream(fis1,fis2);
    int len = 0;
    byte[] byt = new byte[1024];

    FileOutputStream fos = new FileOutputStream("c:\\c.txt");
    while((len = s1.read(byt)) != -1) {
        fos.write(byt,0,len);
    }
    s1.close();
}

案例2:将mp3歌曲文件进行切割合并

public class Demo{
    public static void main(String[] args) throws IOException {
        split(new File("c:\\a.mp3"),10,new File("c:\\"));
        System.out.println("切割完");

        LinkedHashSet<InputStream> hs = new LinkedHashSet<InputStream>();
        hs.add(new FileInputStream(new File("c:\\part.1.mp3")));
        hs.add(new FileInputStream(new File("c:\\part.2.mp3")));
        hs.add(new FileInputStream(new File("c:\\part.3.mp3")));
        hs.add(new FileInputStream(new File("c:\\part.4.mp3")));
        merage(hs, new File("c:\\merage.mp3"));
        System.out.println("合并完毕");
    }

    //合并文件函数
    private static void merage(LinkedHashSet<InputStream> hs, File dest) throws IOException {
        final Iterator<InputStream> it = hs.iterator();
        FileOutputStream fos = new FileOutputStream(dest);
        SequenceInputStream seq = new SequenceInputStream(
                new Enumeration<InputStream>() {
                    @Override
                    public boolean hasMoreElements() {
                        return it.hasNext();
                    }
                    @Override
                    public InputStream nextElement() {
                        return it.next();
                    }
                });
        byte[] byt = new byte[1024 * 1024];
        int len = 0;
        while ((len = seq.read(byt)) != -1) {
            fos.write(byt, 0, len);
        }
        seq.close();
        fos.close();
}

//切割文件,切割之后保存路径
private static void split(File src, int count, File dir) throws IOException {
    FileInputStream fis = new FileInputStream(src);
    FileOutputStream fos = null;
    byte[] byt = new byte[1024 * 1024];
    int len = 0;

    for (int i = 1; i <= count; i++) {
        len = fis.read(byt);
        if (len != -1) {
            fos = new FileOutputStream(dir + "part." + i + ".mp3");
            fos.write(byt, 0, len);
        }
        // fos.close();
    }
    fis.close();
    }
}

2.打印流

1.PrintStream 是一个字节打印流,System.out对应的类型就是PrintStream。

public static void main(String[] args){
    PrintStream ps = System.out;
    //普通write()方法只有调用flush()方法或者close()方法才会在控制台显示。
    ...
}

注意:打印流的三种方法。1.void print(数据类型 变量) 2.println(数据类型 变量) 3.printf(String format,Object… args)

2.PrintWriter 是一个字符打印流,构造函数可以接收四种类型的值。

1.字符串路径
2.File对象
3.OutputStream
4.Writer

3.操作数组的流对象(ByteArrayInputStream/ByteArrayOutputStream)

1.操作字节数组

public static void testByteArrayInputStream() throws Exception {
    InputStream in = new ByteArrayInputStream(new bytep[] {65,66,67});
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    for(int b = -1; (b = in.read()) != -1;){
        out.write(b);
    }
    in.close();
    out.close();
    System.out.println(Arrays.toString(out.toByteArray()));
    System.out.println(out);
}

2.操作字符数组

public static void testCharArrayReader() throws Exception {
    CharArrayReader reader = new CharArrayReader(new char[] {'A','b','c'});
    CharArrayWriter writer = new CharArrayWriter();
    for(int b = -1; (b = reader.reade() != -1);){
        writer.write(b);
    }
    reader.close();
    writer.close();
    System.out.println(writer.toCharArray());
}

本文标题:IO

文章作者:Bangjin-Hu

发布时间:2019年10月15日 - 09:22:26

最后更新:2020年03月30日 - 08:11:01

原始链接:http://bangjinhu.github.io/undefined/Java 字符串与文本IO/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Bangjin-Hu wechat
欢迎扫码关注微信公众号,订阅我的微信公众号.
坚持原创技术分享,您的支持是我创作的动力.