2

現在のクラスの同じパッケージに新しいファイルを作成したいと考えています。

FileOutputStream fileOut = new FileOutputStream(YYY);
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(this);

その目的のための正しい YYY は何ですか?

私はこれを試しました:

FileOutputStream fileOut = new FileOutputStream("myObject");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(this);

ただし、「myObject」ファイルは c:\program files\eclipse に作成されました

助けてください!ありがとう

編集:これはSVNプロジェクトであることを言及する価値があるかもしれません。それと何か関係があるのか​​もしれません

4

2 に答える 2

0

.java ファイル (.class ファイルのみ) が周りにない可能性があり、.class ファイルが (ネストされた) .jar ファイル内に存在する可能性があり、JVM がどのクラスパス エントリが使用されたかを認識できないため、必要なことは不可能です。 .class ファイルを見つけます。

そうは言っても、私は自分のプロジェクトで同じ問題を解決しようとしました。コードは次のようになります。

    private static List<Class> getClassesForPackage(String packagename)
            throws ClassNotFoundException
    {
        // This will hold a list of directories matching the pckgname.
        // There may be more than one if a package is split over multiple
        // jars/paths
        List<Class> classes = new ArrayList<Class>();
        List<File> directories = new ArrayList<File>();
        try {
            ClassLoader classLoader =
                Thread.currentThread().getContextClassLoader();
            if (classLoader == null) {
                throw new ClassNotFoundException("Can't get class loader.");
            }

            // Ask for all resources for the path
            Enumeration<URL> resources =
                classLoader.getResources(packagename.replace('.', '/'));
            while (resources.hasMoreElements()) {

                URL res = resources.nextElement();
                if (res.getProtocol().equalsIgnoreCase("jar")) {

                    JarURLConnection conn =
                        (JarURLConnection) res.openConnection();
                    JarFile jar = conn.getJarFile();
                    for (JarEntry e : Collections.list(jar.entries())) {

                        if (e.getName().startsWith(
                                packagename.replace('.', '/'))
                            && e.getName().endsWith(".class")
                            && !e.getName().contains("$"))
                        {
                            String className =
                                e.getName().replace("/", ".").substring(
                                        0,
                                        e.getName().length() - 6);
                            classes.add(Class.forName(className));
                        }
                    }
                }
                else
                    directories.add(new File(URLDecoder.decode(
                            res.getPath(),
                            "UTF-8")));
            }
        }
        catch (NullPointerException x) {
            throw new ClassNotFoundException(packagename
                + " does not appear to be "
                + "a valid package (Null pointer exception)");
        }
        catch (UnsupportedEncodingException encex) {
            throw new ClassNotFoundException(packagename
                + " does not appear to be "
                + "a valid package (Unsupported encoding)");
        }
        catch (IOException ioex) {
            throw new ClassNotFoundException(
                "IOException was thrown when trying "
                    + "to get all resources for " + packagename);
        }

        List<String> subPackages = new ArrayList<String>();
        // For every directory identified capture all the .class files
        for (File directory : directories) {

            if (directory.exists()) {

                // Get the list of the files contained in the package
                File[] files = directory.listFiles();
                for (File file : files) {

                    // add .class files to results
                    String fileName = file.getName();
                    if (file.isFile() && fileName.endsWith(".class")) {
                        // removes the .class extension
                        classes.add(Class.forName(packagename + '.'
                            + fileName.substring(0, fileName.length() - 6)));
                    }
                    // add directories to subpackages
                    if (file.isDirectory()) {
                        subPackages.add(packagename + "." + fileName);
                    }
                }
            }
            else {
                throw new ClassNotFoundException(packagename + " ("
                    + directory.getPath()
                    + ") does not appear to be a valid package");
            }
        }
        // check all potential subpackages
        for (String subPackage : subPackages) {
            classes.addAll(getClassesForPackage(subPackage));
        }
        return classes;
    }

対応する .java ファイルのディレクトリを見つけるには、使用しているソース ディレクトリを構成する必要があります。

于 2012-11-10T13:48:32.383 に答える
0

単純なケースでテスト済み:

URL resource = this.getClass().getClassLoader().getResource(this.getClass().getName().concat(".class"));

これにより、.class ファイルが取得されます。.java ファイルがシステム上にない可能性があることに注意してください。

于 2012-11-10T13:25:13.750 に答える