如何让Java读取文件内容时按原换行格式返回结果?
解决文件内容读取后丢失换行的问题
这问题我之前也碰到过——原因很简单:Scanner.nextLine()方法读取每行内容时,会自动丢弃行尾的换行符,你直接把所有行拼在一起,自然就变成一整行了。给你两个实用的解决方案:
方案一:改进原有拼接逻辑(兼容低版本Java)
把原来的字符串拼接改成用StringBuilder(循环里用String拼接性能很差,因为String是不可变对象),并且每次读完一行后手动加上换行符。另外用try-with-resources语法自动管理Scanner资源,避免空指针异常和资源泄漏:
public class SwimmingWorkout implements Workout { @Override public String getWorkout() { File fr = new File("swimmingWorkout_beginner.txt"); StringBuilder workoutContent = new StringBuilder(); // try-with-resources会自动关闭Scanner,不用手动调用sc.close() try (Scanner sc = new Scanner(fr)) { while (sc.hasNextLine()) { // 读取一行后,追加系统对应的换行符 workoutContent.append(sc.nextLine()).append(System.lineSeparator()); } } catch (FileNotFoundException e) { e.printStackTrace(); } // 可选:trim()去掉最后一行多余的换行符,根据你的需求决定要不要加 return workoutContent.toString().trim(); } }
这里用System.lineSeparator()而不是硬写"\n",是因为不同操作系统的换行符不一样(Windows是\r\n,Linux/macOS是\n),这个方法会自动适配当前系统,兼容性更好。
方案二:用Java NIO简化代码(Java 11+推荐)
如果你的项目用的是Java 11或更高版本,直接用Files.readString()方法一步到位,它会直接读取整个文件的全部内容,包括所有原有的换行符,代码简洁到离谱:
import java.nio.file.Files; import java.nio.file.Paths; public class SwimmingWorkout implements Workout { @Override public String getWorkout() { try { // 直接读取整个文件内容,保留所有格式 return Files.readString(Paths.get("swimmingWorkout_beginner.txt")); } catch (Exception e) { e.printStackTrace(); return ""; } } }
另外提个小细节:你原来的代码有个潜在bug——如果文件找不到,sc会是null,后面的while(sc.hasNextLine())会直接抛出NullPointerException,上面两个方案都解决了这个问题。
内容的提问来源于stack exchange,提问作者Gregory
相关产品推荐
相关产品推荐

