2017-09-05 12 views
0

プロパティファイルを読み込み、プロパティファイルの指定されたキーの値を読み込もうとしています。javaプロパティで同じストリームの入力ストリームが再度読み込まれない

text.properties 
A=Z 
B=Y 
C=X 

public class TestStreams { 
static String path = "test.properties"; 

public static void main(String[] args) throws IOException { 
    TestStreams test = new TestStreams(); 
    InputStream stream = new FileInputStream(new File(path)); 

    System.out.println(test.getValue(stream, "A")); 
    System.out.println(test.getValue(stream, "B")); 
    System.out.println(test.getValue(stream, "C")); 
} 

public String getValue(InputStream stream, String key) throws IOException { 
    Properties props = new Properties(); 
    String value = null; 
    try { 
     props.load(stream); 
     value = props.getProperty(key); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return value; 
    } 
} 

Output : 
Z 
null 
null 

は私が小道具にprops.load負荷で最初のprint文のために、すべての3つのプロパティをデバッグしようとしたが、第二と第三の印刷文props.load負荷が小道具にプロパティをゼロにするために:プロパティファイルは次のようになります。

+0

最初のprops.load(ストリーム)は、ファイルの内容全体をプロパティオブジェクトに読み込み、最初のgetValueのプロパティオブジェクト"A"、 "B"、 "C" "プロパティオブジェクトは返されないので、ガベージコレクションされます。次にgetValueを呼び出すと、新しいPropertiesオブジェクトが作成されますが、ストリームがすでにファイルの最後に到達しているため、読み込みには何も残っていません(getValueへの今後の呼び出しでも同様です)。 – Sticks

+0

なぜ、これはとにかく 'Properties'オブジェクトを保存するのではなく、これを行うのでしょうか? – EJP

答えて

0

初めてプロパティファイルを読み込んだ後、FileInputStreamの最後に達した後で読み込みが行われ、新しいPropertiesインスタンスは空のままになります。新しいFileInputStreamを作成するか、またはPropertiesの読み取りと作成を1回行い、それをgetValueの呼び出しに使用する必要があります。

0

提供されたストリームはprops.loadの後にその最後の位置にあるため、それ以上の情報は読み取れません。

あなたが各呼び出しの前にストリームを再オープンまたは(より良い)するか、一度だけのプロパティをロードし、Propertiesインスタンスを再利用:サイドノートとして

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.Properties; 

public class TestStreams { 
    static String path = "test.properties"; 

    public static void main(String[] args) throws IOException { 
     TestStreams test = new TestStreams(); 
     InputStream stream = new FileInputStream(new File(path)); 

     System.out.println(test.getValue(stream, "A")); 
     System.out.println(test.getValue(stream, "B")); 
     System.out.println(test.getValue(stream, "C")); 

     // Variant 1 
     stream = new FileInputStream(new File(path)); 
     System.out.println(test.getValue(stream, "A")); 
     stream = new FileInputStream(new File(path)); 
     System.out.println(test.getValue(stream, "B")); 
     stream = new FileInputStream(new File(path)); 
     System.out.println(test.getValue(stream, "C")); 

     // Variant 2 
     stream = new FileInputStream(new File(path)); 
     Properties props = new Properties(); 
     props.load(stream); 
     System.out.println(props.getProperty("A")); 
     System.out.println(props.getProperty("B")); 
     System.out.println(props.getProperty("C")); 
    } 

    public String getValue(InputStream stream, String key) throws IOException { 
     Properties props = new Properties(); 
     String value = null; 
     try { 
      props.load(stream); 
      value = props.getProperty(key); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return value; 
    } 
} 

、あなたが作るためにtry-with-resourcesステートメントを使用する必要がありますあなたのストリームがその後閉じられることを確認してください:

関連する問題