Если вам абсолютно нужна локальная копия файла, вам нужно будет открыть InputStream
копию содержимого в локальный файл, в котором вы знаете путь, а затем перейти оттуда. Sidenote: Guava ByteStreams#copy
- это простой способ выполнить это.
Конечно, этот файл больше не поддерживается исходным источником Uri, поэтому я не думаю, что это то, что вы хотите. Вместо этого вы должны работать с API-интерфейсом Uri. Взгляните на Storage Access Framework
Изменить
Вот как вы можете получить InputStream
из вашего Uri
InputStream inputStream = getContentResolver().openInputStream(uri);
Префикс:
int a=0;
int b=++a; // b=1,a=1
перед присвоением значение будет увеличиваться.
Постфикс:
int a=0;
int b=a++; // a=1,b=0
сначала присвойте значение «a» значению «b», а затем увеличьте значение «a»
На самом деле return (i++)
вернет только 10.
Операторы ++ и - могут быть помещены до или после переменной, с различными эффектами. Если они раньше, то они будут обработаны и возвращены и, по существу, будут обрабатываться точно так же, как (i-1) или (i + 1), но если вы поместите ++ или - после i, то возврат будет существенно ниже ]
return i;
i + 1;
Таким образом, он вернет 10 и никогда не будет увеличивать его.
Постфиксный инкремент ++
не увеличивает значение своего операнда до тех пор, пока он не будет оценен. Значение i++
равно i
.
Префикс декремента увеличивает значение своего операнда до его оценки. Значение --i
равно i - 1
.
Увеличение / уменьшение префикса изменяет значение до вычисления выражения. Постфиксный приращение / уменьшение меняет значение после.
Итак, в вашем случае fun(10)
возвращает 10, и при печати --i
печатается i - 1
, что равно 9.
i ++ - постинкремент. Приращение происходит после того, как значение возвращено.
Существует большая разница между постфиксной и префиксной версиями ++
.
В префиксной версии (то есть, ++i
) значение i
увеличивается, а значением выражения является новое значение i
.
В постфиксной версии (то есть, i++
) значение i
увеличивается, но значением выражения является первоначальное значение i
.
Давайте построчно проанализируем следующий код:
int i = 10; // (1)
int j = ++i; // (2)
int k = i++; // (3)
i
установлен в 10
(просто). i
увеличивается до 11
. i
копируется в j
. Итак, j
теперь равно 11
. i
увеличивается до 12
. i
(то есть 11
) копируется в k
. Итак, k
теперь равно 11
. Таким образом, после запуска кода, i
будет 12, но j
и k
будет 11.
То же самое относится и к постфиксным и префиксным версиям --
.
Функция возвращает значение до того, как значение i
увеличивается, поскольку вы используете оператор пост-исправления (++). Во всяком случае, приращение i
не является глобальным - только для соответствующей функции. Если бы вы использовали оператор предварительной фиксации, он был бы 11
, а затем уменьшен до 10
.
Таким образом, вы возвращаете i
как 10 и уменьшаете его в функции printf, которая показывает 9
не 10
, как вы думаете.
Есть два примера, иллюстрирующих разницу
int a , b , c = 0 ;
a = ++c ;
b = c++ ;
printf (" %d %d %d " , a , b , c++);
a = 1
и значению c = 1
следующее значение присвоения следующего оператора от c = 1
до b, затем увеличить c на 1, так что значение b = 1
и значение c = 2
в printf
утверждение, что у нас есть c++
, это означает, что первоначальное значение c, равное 2, будет напечатано, а затем с приращением c увеличится на 1, поэтому printf
оператор выведет 1 1 2
, а значение c теперь равно 3
вы можете использовать http://pythontutor.com/c.html
int a , b , c = 0 ;
a = ++c ;
b = c++ ;
printf (" %d %d %d " , a , b , ++c);
printf
оператор ++c
будет увеличивать значение c на 1 сначала затем назначьте новое значение 3 для c, чтобы оператор printf
напечатал 1 1 3
Это связано с тем, как работает оператор постинкрементной обработки. Возвращает значение i, а затем увеличивает его.
Во-первых, обратите внимание, что параметр функции с именем i
и переменная с именем i
в main()
являются двумя разными переменными. Я думаю, что это не имеет большого значения для настоящей дискуссии, но важно знать.
Во-вторых, вы используете оператор постинкремента в fun()
. Это означает, что результатом выражения является значение до увеличения i
; конечное значение 11 из i
просто отбрасывается, и функция возвращает 10. Переменной i
обратно в main, являющейся другой переменной, присваивается значение 10, которое затем уменьшается, чтобы получить 9.
Объяснение:
Шаг 1: int fun(int);
Здесь мы объявляем прототип функции fun()
.
Шаг 2: int i = fun(10);
Переменная i объявляется как целочисленный тип, и результат fun(10)
будет сохранен в переменной i
.
Шаг 3: int fun(int i){ return (i++); }
Внутри fun()
мы возвращаем значение return(i++)
. Возвращает 10
. потому что i++
является оператором после инсерции.
Шаг 4: Затем управление возвращается к основной функции, и значение 10
присваивается переменной i
.
Шаг 5: printf("%d\n", --i);
Здесь --i
обозначает предварительное слияние. Следовательно, он печатает значение 9
.
fun (10) возвращает 10. Если вы хотите, чтобы он возвращал 11, вам нужно использовать ++ i, а не i ++.
int fun(int i)
{
return ++i;
}
На самом деле, когда вы используете постфикс, то есть i ++, для возврата используется начальное значение i, а не увеличенное. После этого значение i увеличивается на 1. И это происходит с любым оператором, использующим i ++, т. Е. Сначала в выражении используется начальное значение i, а затем оно увеличивается.
И полная противоположность происходит в префиксе. Если бы вы вернули ++ i, то возвращается увеличенное значение, то есть 11, потому что сначала добавляется 1, а затем возвращается.