자바 리소스 조작 입력 및 출력 스트림은 동일한 커버리지 트리거 충돌 해결을 달성

첫째, 문제의 장면

제목 : 대문자의 s.txt의 차례가, 대문자 차례 소문자, 소문자 전에 입력 파일에 커버, 밑줄로 공간을 설정하는

어떤 이전 질문은 질문은 동일한 작동 문제의 파일, 파일의 리어 커버의 출력 스트림의 입력을 발생하지

둘째, 흰색 운영

//口述一下,
//头就创建一个文件输入流对象,紧接着创建一个文件输出流对象,问题就在这里,后面是调用各流的读写方法
//调试:发现read()方法首次读取就是返回-1,说明遇到了文件末尾,也说明此时文件时空的
//运行结果:文件被置空了,原来的内容没了,也没有写入内容进去
public void wordCase(String path){
        try(//------①
        FileReader fr = new FileReader(path);//------②
        FileWriter fw = new FileWriter(path))//------③
        {
            System.out.println(new File(path).length());
            //记录读取到的字符
            StringBuilder sb = new StringBuilder();
            int hasRead = 0;
            while((hasRead = fr.read()) != -1){
                char c = (char)hasRead;
                //转空格
                if(c == ' '){
                    sb.append("_");
                }
                System.out.println(c);
                //判断是否是小写
                if(Character.isLowerCase(c)){
                    //转换成大写并加入字符串
                    sb.append(Character.toUpperCase(c));
                }else{
                    //转换成小写并加入字符串
                    sb.append(Character.toLowerCase(c));
                }
            }
            //将新字符串内容写入文件
                fw.write(sb.toString());
        }catch(IOException e){
            e.printStackTrace();
        }
    }

셋째, 이유를 분석

요약하면, 몇 가지 정보를 찾기 :

충돌을 유발, 파일 경로와 함께 작동, 출력 스트림을 열고 닫혀 있지 않은 경우와 자원의 흐름을 입력하고 스테핑 :에서 실행 봐 마크 코드, 위의 ① -> ② -> ①-- > ③ -> ① -> 다음 ... 내가 볼 수있는 모든 시간이 다 떨어지기 ②③ 수술 후 단계 ③에서 발견 현지 텍스트는, 파일의 내용이 비워있다;

다음에 실행 ③, 출력 스트림이 액세스 또는 제한된 액세스하고 직접 더가 없을 것,하지 어떤 FileNotFoundException이가 발생, 적은 자원을 얻을, 따라서 나는 당신이 ②에 실행할 때, 입력 스트림은 리소스 파일을 얻을 수 추측 원본 파일의 파일을 생성하는 파일 내용이 파일이 궁극적으로 널 빈 쓰기, 그래서 것을, 비어의 때문에 빈 문서, 획득 된 입력 스트림 파일 리소스를 다시 내용을 읽어, 대체되었습니다

넷째, 오류 수정

정직한 작품은 내용을 읽고 완료 한 후 다음을 작성 :

//测试方法:略...
public void wordCase(String path){
    StringBuilder sb = null;
    /*读取文件内容,并保存成字符串*/
    try(
        FileReader fr = new FileReader(path))
    {
        System.out.println(new File(path).length());
        //记录读取到的字符
        sb = new StringBuilder();
        int hasRead = 0;
        while((hasRead = fr.read()) != -1){
            char c = (char)hasRead;
            //转空格
            if(c == ' '){
                sb.append("_");
            }
            System.out.println(c);
            //判断是否是小写
            if(Character.isLowerCase(c)){
                //转换成大写并加入字符串
                sb.append(Character.toUpperCase(c));
            }else{
                //转换成小写并加入字符串
                sb.append(Character.toLowerCase(c));
            }
        }
    }catch(IOException e){
        e.printStackTrace();
    }
    /*将新字符串内容写入文件*/
    try(
        FileWriter fw = new FileWriter(path))
    {
        fw.write(sb.toString());
    }catch(IOException e){
        e.printStackTrace();
    }
}

다섯째, 마지막으로

저와 함께 오래 드라이버 밴드, ~ 흰색에 대한 자세한 내용, 의견을 표현하는 전임자를 이해

추천

출처www.cnblogs.com/csyh/p/12527470.html