java中的文件结构

java中的文件结构,java,Java,您好,我是Java新手,所以我想了解一些关于如何用Java组织项目文件的指南。目前,我正在使用GUI构建一个应用程序,因此我需要两个文件,一个与GUI相关,另一个与从第一个GUI调用的任何函数相关。现在,我将第二个文件命名为Utilities.java,如下所示: package Directory; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; impo

您好,我是Java新手,所以我想了解一些关于如何用Java组织项目文件的指南。目前,我正在使用GUI构建一个应用程序,因此我需要两个文件,一个与GUI相关,另一个与从第一个GUI调用的任何函数相关。现在,我将第二个文件命名为Utilities.java,如下所示:

package Directory;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.swing.JProgressBar;
import javax.swing.JTextArea;
import javax.swing.SwingWorker;


public class Utilities {

    public class FileCopy{
        private File  Source;
        private File Destination;
        private long totalBytes=0L;

        FileCopy(File source,File destination){
            Source=source;
            Destination=destination;
            retrieveTotalBytes(source);
        }

        File getSource(){return Source;}
        File getDestination(){return Destination;}
        Long gettotalBytes(){return totalBytes;}

        private void retrieveTotalBytes(File sourceFile)
        {
                if(sourceFile.isDirectory()==false){
                    totalBytes = sourceFile.length();
                }
                else{
                    File[] files = sourceFile.listFiles();
                    for(File file : files)
                    {
                        if(file.isDirectory()) retrieveTotalBytes(file);
                        else totalBytes += file.length();
                    }
                }
                System.out.print("Done retrieving");
         }  
    }


    public class Copy extends SwingWorker<Void,Integer>
    {

      File src,dest;
      InputStream in;
      OutputStream out;
      JProgressBar progressBar;
      JProgressBar all;
      JTextArea txt;
      public int progress;
      //private int all_progress;
      private long totalBytes = 0L;
      private long copiedBytes = 0L;
      boolean keepStructure=false;
      boolean delete=false;

          public Copy(File source,File dst,JProgressBar br,JTextArea text,boolean keep,boolean delete)
          {
             src=source;
             dest=dst;
             progressBar=br;
             txt=text;
             progressBar.setValue(0);
             progressBar.setVisible(true);
             txt.setText("Copying " + src.getName());
             keepStructure=keep;
             this.delete=delete;
          }

            @Override
            public Void doInBackground() throws Exception
            {
                txt.setText(src.getName());
                //retrieveTotalBytes(src);
                copyFiles(src, dest);

                return null;
            }

            @Override
            public void process(java.util.List<Integer> chunks)
            {
                for(int i : chunks)
                {
                    progressBar.setValue(i);

                }
            }

            @Override
            public void done()
            {
                setProgress(100);
            }


            public String GetParent(String input){
                short pos=(short) input.lastIndexOf(File.separatorChar);
                return input.substring(0, pos);
            }

            private void copyFiles(File sourceFile, File targetFile) throws IOException
            {
                if(sourceFile.isDirectory())
                {
                    if(!targetFile.exists()) targetFile.mkdirs();

                    String[] filePaths = sourceFile.list();

                    for(String filePath : filePaths)
                    {
                        File destFile;
                        File srcFile = new File(sourceFile, filePath);

                        if(keepStructure==true)
                            destFile= new File(targetFile, filePath);
                        else{
                            String filepath2=GetParent(dest.toString())+File.separatorChar+srcFile.getName();
                            destFile=new File(filepath2);
                        }

                        System.out.print("\n\n name="+destFile.toString()+"\n");
                        System.out.print("dest to string =" +GetParent(dest.toString()) + "  srcFile.getName()="+srcFile.getName()+"\n" );

                        copyFiles(srcFile, destFile);
                    }
                }
                else
                {
                    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourceFile));
                    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(targetFile));

                    long fileBytes = sourceFile.length();
                    long soFar = 0L;

                    int theByte;

                    while((theByte = bis.read()) != -1)
                    {
                        bos.write(theByte);

                        setProgress((int) (copiedBytes++ * 100 / totalBytes));
                        publish((int) (soFar++ * 100 / fileBytes));
                    }

                    bis.close();
                    bos.close();
                    if(delete==true)
                        sourceFile.delete();
                    publish(100);
                    txt.setText("Copying " + src.getName() + "complete");
                  }
            } 
       }
}
我收到这个错误:

无法访问类型为Utilities的封闭实例。必须符合条件 带有类型为Utilities(例如。 x、 新的A(),其中x是实用程序的实例)


在Java中,您应该(至少在您还在学习基础知识的时候)将每个类保存在自己的文件中。

您的文件中有3个(而不是2个)类:
Utilities
FileCopy
Copy
,后两个类是
Utilities
的内部类(
Utilities
类本身不做任何事情)。这就是为什么在没有先实例化
实用程序的情况下,不能实例化
复制

我认为您应该有一个名为
实用程序
的包,其中包含两个文件:
FileCopy.java
Copy.java
,每个文件都包含自己的类。如果您想要一种方法来区分应用程序的各个部分,那么这是一个很好的开始:有一个包含所有gui相关类的包,另一个包用于应用程序的其余部分

这将解决您的错误


关于嵌套类的官方教程:

将它们全部放在单独的.java文件中,很可能您的问题就解决了。当您进一步了解Java时,您将了解有关内部(非静态)类的详细信息。现在开始,您应该遵循Java命名约定。@petermm您能为我提供有关命名约定的任何好链接吗?提前谢谢!下面是一个关于Java命名约定的维基百科示例。我仍在尝试从Oracle的网站上获取一些官方约定,但还找不到。重要的命名约定:包名称完全是小写的(
package directory
),字段名和方法名以小写开头,但每一个单词都大写:
getTotalBytes
私有文件目的地。(下划线不用于分隔单词)类名以大写字母开头,并将下一个单词大写。
Copy worker = new Copy(source,dest,progressBar,textArea, keep_Structure,false);