【问题标题】:How do i create/modify the contents of a file before i create it in a Java program i have made?在我制作的 Java 程序中创建文件之前,如何创建/修改文件的内容?
【发布时间】:2014-01-13 02:45:26
【问题描述】:

嘿,这是我的代码,我创建了一个简单的文件创建程序,因为过去 2 天我只使用 java。我只有 13 岁,所以请保持简单:)

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class Filecreator 
{
    public static void main( String[] args )
    {   
        Scanner read = new Scanner (System.in);
        String y;
        String u;


        try {
            System.out.println("Please enter the name of your file!");

            y = read.next();

            while (y.contains(".") || y.contains(",") || y.contains("{") || y.contains("}") || y.contains("@")){
                System.out.println("Your Filename contains an incorrect character you may only use Number 0-9 And Letters A-Z");
                System.out.println("Please Re-enter your file name");

                y = read.next();          
            }

            System.out.println("Please enter the file type name");

            u = read.next();

            while (u.contains(".") || u.contains(",") || u.contains("{") ||     u.contains("}") || u.contains("@") ){
                System.out.println("Your File-type name contains an incorrect character      you may only use Number 0-9 And Letters A-Z");
                System.out.println("Please Re-enter your file-type name");

                u = read.next();
            }


            File file = new File( y + "." + u );


            if (file.createNewFile()){
                System.out.println("File is created!");
            System.out.println("The name of the file you have created is called " + y +   file);
            }else{
                System.out.println("File already exists.");
            } 
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

如果您在诸如 Eclipse 之类的程序上运行它,您将看到输出。但是我希望能够在最终选择名称和文件类型然后保存之前编辑[文件]的内容。无论如何我可以做到这一点吗?谢谢 - 乔治

【问题讨论】:

  • 对不起。没明白。您要修改尚未创建的内容吗?
  • 我建议您使用(至少)另外两种方法来创建您的程序。一、构造一个OutputStream(例如一个FileOutputStream)。其次,使用OutputStream 来计算和编写您的输出。您甚至可能想使用我的OutputStreamMultiplier
  • 我认为这个答案显示了一个 13 岁的孩子的大量研究工作。但是,请编辑您的问题并说明它是否是您要编辑的文件内容。我只是有点猜到了。

标签: java eclipse file java-io


【解决方案1】:

您不能在创建文件之前对其进行编辑。您可以在创建文件后更改要写入文件的数据;由于您控制了该数据和文件的创建,因此应该没有问题。

【讨论】:

    【解决方案2】:

    目前您正在将所有内容打印到控制台 - 这是在您使用 System.out.println(...) 时完成的。

    您可以做的是将输出写入其他地方。你怎么能做到这一点?最简单的方法是使用 StringBuilder:

    http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html

    这是一个代码示例:

    StringBuilder sb = new StringBuilder();
    sb.append("one ");
    sb.append("two");
    String output = sb.toString(); // output contains string "one two"
    

    现在您的整个输出都在一个字符串中。如果您查看 StringBuilder 文档(上面的链接),您会发现还有其他有用的方法,例如插入或删除,可以帮助您在将输出转换为字符串之前修改输出(使用 toString 方法)。完成所有修改后,您可以将此字符串写入文件。

    对于将字符串写入文件,这可能会有所帮助:

    How do I save a String to a text file using Java?

    如果您正在编写小文件(最多几 MB),这已经足够了。如果要写入更大的文件,则不应在将整个字符串写入文件之前将其存储在内存中。在这种情况下,您应该创建较小的字符串并将它们写入文件。有一个很好的教程:

    http://www.mkyong.com/java/how-to-write-to-file-in-java-bufferedwriter-example/

    【讨论】:

      【解决方案3】:

      读取行,直到该行包含一个特殊的文件结束标记。例如,旧的 unix 程序 'mail' 追加所有行,直到包含单个 '.' 的行。被读取。

      // insert this before reading the filename
      StringBuilder content = new StringBuilder();
      
      s = read.next();
      
           while( !s.equals(".")) {
               content.append(s);
               content.append(String.format("%n"));
               s = read.next();
          }
      

      看看这个:write a string into file(比另一个更好的答案)并以此为例说明如何在创建文件后将内容实际写入文件。





      附言

      专业提示:我相信您已经注意到您复制了完全相同的行来检查文件名是否有效。一个好的程序员也会注意到这一点并“提取”一个在一个地方执行逻辑的方法。

      示例:

      boolean isValidFilename( String s ) {
          return !(y.contains(".") || y.contains(",") || y.contains("{") || y.contains("}") || y.contains("@")));
      }
      

      然后您可以更换支票;

      while (!isValidFilename( u )){
          System.out.println("Your File-type name contains an incorrect character...etc");
      }         
      

      这很好,因为您不必重复棘手的代码,这意味着出错的地方更少。顺便说一句,否定 (!) 是为了避免否定名称 (invalid=true),因为您可能会结束使用它们时使用双重否定(not invalid=true),这可能有点令人困惑。

      【讨论】:

      • 感谢您编辑它并帮助我 :) 我很努力地欢呼
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-05
      • 2020-05-27
      • 1970-01-01
      • 2022-06-25
      相关资源
      最近更新 更多