高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A

Java 11 - Java File Paths are not Unix File Paths (Updated 20-March-2000)


Q: Java コードでファイルを利用しています。このコードは Unix システム上では完璧に動作しますが、Macintosh 上ではうまく動作しません。なぜでしょうか?

A: Java におけるファイルのパスの仕様は Unix の仕様と異なります。以下のような Unix に特有のパスの指定方法を避けて、Java コードがプラットフォームに依存しないようにする必要があります。

  • /tmp”は、書き込み可能な一時ディレクトリは必ずしも存在しません。MRJ を使っているときは、MRJToolkit で“Temporary Items”フォルダ(一時使用項目用フォルダ)を取得します。次のサンプルクラスをご覧下さい。

import java.io.File;
import java.io.FileNotFoundException;

import com.apple.mrj.MRJFileUtils;

public class MRJTempFolder
{
    /**
     * Mac OS の“Temporary Items”フォルダ(一時使用項目用フォルダ)を返す。
     * “Temporary Items”フォルダ(一時使用項目用フォルダ)を表す File オブジェクトを
     * 返すか、そのフォルダを見つけられなかった場合は null を返す。
     */
    public static File getTempFolder()
    {
        File tempFolder = null;
        
        try
        {
            tempFolder = MRJFileUtils.findFolder(MRJFileUtils.kTemporaryFolderType);
        }
        catch (FileNotFoundException exc) { }
        
        return tempFolder;
    }
}

  • /dev/null”を使って、ビットバケットへの書き込みはできません。代わりに、java.io.OutputStream のサブクラスを使って write(int) を空のメソッドとして実装し、コンストラクタ java.io.PrintStream を介してサブクラスのインスタンスを System.setOut に渡します。次のサンプルクラスを参考にしてください。

import java.io.*;

/**
 * 不要なバイトのレポジトリ
 * 基本的には /dev/null を置き換える
 */
public class BitBucketOutputStream extends OutputStream
{
    /**
     * BitBucketOutputStream を出力として使えるように System.Out を設定する。
     * 結果として、標準の出力を使わないことになる。
     * restoreSystemOut を参照
     */
    public static void nullSystemOut()
    {
        System.setOut(new PrintStream(new BitBucketOutputStream(), true));
    }
    
    /**
     * デフォルトの System.out に似た System.out を再度作成し
     * デフォルトの動作を復元する。
     * nullSystemOut を参照
     */
    public static void restoreSystemOut()
    {
        FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
        System.setOut(new PrintStream(new BufferedOutputStream(fdOut, 128), true));
    }

    /**
     * BitBucketOutputStream を出力ストリームとして利用するように System.err を
     * 設定する。結果として、標準のエラーを使わないことになる。
     * restoreSystemErr を参照。
     */
    public static void nullSystemErr()
    {
        System.setErr(new PrintStream(new BitBucketOutputStream(), true));
    }
    
    /**
     * デフォルトの System.err に似た System.err を再度作成し
     * デフォルトの動作を復元する。
     * nullSystemErr を参照
     */
    public static void restoreSystemErr()
    {
        FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
        System.setErr(new PrintStream(new BufferedOutputStream(fdErr, 128), true));
    }
    
    /**
     * 指定されたバイトに対して何もしない
     *
     * @param      b 無視するバイト
     * @exception  IOException は I/O エラーが起こった場合
     */
    public void write(int b) throws IOException
    { }
}

Choose your language: